Docs / MCP

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:

MCP endpoint
https://mcp.vioscale.ai/mcp

Sign 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.

  1. In your client (e.g. Claude → Settings → Connectors → Add custom connector), enter the URL https://mcp.vioscale.ai/mcp.
  2. Connect — you're redirected to vioscaleAI to sign in (or create an account).
  3. 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 Code CLI
claude mcp add --transport http vioscale https://mcp.vioscale.ai/mcp \
  --header "Authorization: Bearer vsk_your_key"
.mcp.json
{
  "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:

claude_desktop_config.json
{
  "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

ToolArgumentsReturnsDescription
search_softwarequery: string, limit?, country?, integration?, filter?, intent?, weights?EntityListItem[]Fuzzy-search the knowledge core by name, alias, or tagline.
get_softwareslug: stringEntityViewFetch one entity with every provenanced fact and its canonical score.
list_softwarecategory?, limit?, sort?, country?, integration?, filter?, intent?, weights?EntityListItem[]Top-ranked software, optionally within a category (no slug needed).
list_categoriesparent?Category[]Top-level categories by default; pass a parent slug to drill into its sub-categories.
get_categoryslug: string, country?, integration?, filter?, intent?, weights?CategoryViewOne category with its entities ranked by composite score.
compare_softwareslugs: string[], intent?, weights?, withProvenance?ComparisonViewAlign 2-6 tools attribute-by-attribute with a leader.
get_alternativesslug: string, limit?, country?, integration?, filter?, intent?, weights?EntityListItem[]Same-category alternatives, ranked.
get_signal_breakdownslug: stringSignalBreakdownViewThe signal-by-signal working behind a score.
list_intents-IntentCatalogueThe 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 call · compare_software
{
  "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>).