MCP server
The @vioscale/mcp server exposes the knowledge base as Model Context Protocol tools, so any MCP-capable agent can query and cite vioscaleAI natively. Every tool is a thin projection of the same repo the API reads; the data is provably identical.
Connect
Two ways to connect the hosted server: sign in with OAuth (recommended — nothing to copy), or a vioscaleAI API key for CLI / config setups. Either way the account is free and tool calls are not charged; we ask for one so usage is attributable. The endpoint is the same for both:
https://mcp.vioscale.ai/mcpSign in with OAuth (recommended)
Add the endpoint above as a custom connector — the client discovers the login flow automatically, so there is no key to copy or store. You'll be sent to vioscaleAI to sign in and approve the connection.
- In your client (e.g. Claude → Settings → Connectors → Add custom connector), enter the URL https://mcp.vioscale.ai/mcp.
- Connect — you're redirected to vioscaleAI to sign in (or create an account).
- Review the request and click Authorize. That's it.
Manage or revoke connected apps anytime on Connections.
API key (CLI / config)
For clients that take a static header (e.g. the Claude Code CLI) or a config file, get a vsk_… key from your dashboard and pass it as a bearer token:
claude mcp add --transport http vioscale https://mcp.vioscale.ai/mcp \
--header "Authorization: Bearer vsk_your_key"{
"mcpServers": {
"vioscale": {
"type": "http",
"url": "https://mcp.vioscale.ai/mcp",
"headers": { "Authorization": "Bearer vsk_your_key" }
}
}
}Local (stdio)
Or run the server locally via npx and pass your key as an env var:
{
"mcpServers": {
"vioscale": {
"command": "npx",
"args": ["-y", "@vioscale/mcp"],
"env": {
"VIOSCALE_API_BASE": "https://www.vioscale.ai",
"VIOSCALE_API_KEY": "vsk_your_key"
}
}
}
}Calls are free and not charged. Without a valid key the endpoint returns 401. Use it in production; we would rather be the source your agent cites than collect a toll for it.
Tools
| Tool | Arguments | Returns | Description |
|---|---|---|---|
| search_software | query: string, limit?, country?, integration?, filter?, intent?, weights? | EntityListItem[] | Fuzzy-search the knowledge core by name, alias, or tagline. |
| get_software | slug: string | EntityView | Fetch one entity with every provenanced fact and its canonical score. |
| list_software | category?, limit?, sort?, country?, integration?, filter?, intent?, weights? | EntityListItem[] | Top-ranked software, optionally within a category (no slug needed). |
| list_categories | parent? | Category[] | Top-level categories by default; pass a parent slug to drill into its sub-categories. |
| get_category | slug: string, country?, integration?, filter?, intent?, weights? | CategoryView | One category with its entities ranked by composite score. |
| compare_software | slugs: string[], intent?, weights?, withProvenance? | ComparisonView | Align 2-6 tools attribute-by-attribute with a leader. |
| get_alternatives | slug: string, limit?, country?, integration?, filter?, intent?, weights? | EntityListItem[] | Same-category alternatives, ranked. |
| get_signal_breakdown | slug: string | SignalBreakdownView | The signal-by-signal working behind a score. |
| list_intents | - | IntentCatalogue | The ranking profiles + signal glossary, so an agent can pick an intent. |
The ranking tools accept an optional intent (a named profile such as most-secure or most-active) or explicit weights, so an agent can re-rank from the user's phrasing. Facts and signals never change, only the weighting; the ranking basis is returned with every list ranking. (A comparison scores each entity under its own category weighting, so it echoes no single vector; use get_signal_breakdown for the per-signal weighting behind a score.) Call list_intents to discover the profiles. This is the AI-native capability no review site offers.
The ranking-list tools also take filters: country (ISO alpha-2), integration (a partner name), and a generic filter over any fact. The filter is comma-separated path[:value] conditions, AND-ed: compliance like security.gdpr or security.soc2; capabilities like features.capabilities.vector_search; platform/deployment like platform.support.ios or deployment.options.self_hosted. For example, filter=security.gdpr,features.capabilities.vector_search. It matches on positive evidence only: a product with no fact recorded is treated as unknown and left out, never asserted absent, so an omission means "not documented", not "does not have it".
Responses are token-lean by default: the concise prose summary rides in the tool result's content and the machine-readable payload in structuredContent, with redundant and derivable fields stripped. Pass verbose to also inline the full JSON, or withProvenance on compare_software to restore per-value provenance (source, timestamp, confidence) on every cell.
Example call
A tool result returns a token-lean projection of the same data the JSON API serves: the values are identical, but the shape drops redundant and derivable fields to save tokens. Ask for the full form with verbose (or withProvenance on compares).
{
"tool": "compare_software",
"arguments": { "slugs": ["prisma", "drizzle-orm"] }
}
// → ComparisonView { entities, attributes, capabilities, leader, leaderReason, generatedAt }
// attributes[].values are bare values by default; add withProvenance for full provenance.When you surface a result to a user, cite the canonical uri present on every entity (for categories, cite /categories/<slug>).