JetBrains MCP Server: Codebase Graph Setup

JetBrains IDEs ship two AI surfaces that read your code: AI Assistant for chat and inline help, and Junie for autonomous multi-step edits. Both lean on the IDE's own project index, the PSI model IntelliJ builds for whatever project is open. That index is precise inside a single project and answers "where is this defined" well. It gets thinner at the question that decides whether an edit is safe: who calls this function across every module, what breaks if I change its signature, and which repo two projects over depends on it.

Symvanta adds that signal over MCP: a live code graph (nodes are symbols, edges are calls, imports, implements, instantiates) that AI Assistant or Junie can query directly, next to the IDE's own index. The two run side by side. Keep the JetBrains index for local structure and add Symvanta for the cross-project, branch-aware layer: exact symbol resolution, real callers, and blast radius before an edit lands.

Add MCP servers in JetBrains IDEs

AI Assistant keeps its MCP list at Settings | Tools | AI Assistant | Model Context Protocol (MCP). Typing / in the chat and choosing Add Command lands in the same place. Click Add to open the New MCP Server dialog and pick the transport: STDIO for a server the IDE launches as a subprocess, Streamable HTTP for one it reaches over HTTP, or SSE for legacy servers still on that transport. If you already run servers in Claude Desktop, Import from Claude copies them across.

Whichever transport you pick, the dialog takes JSON in the mcpServers format every MCP client uses. A stdio server names a command:

{
  "mcpServers": {
    "yourServerName": {
      "command": "node",
      "args": ["path/to/server.js"]
    }
  }
}

An HTTP server names a URL:

{
  "mcpServers": {
    "yourServerName": {
      "url": "https://example.com/mcp"
    }
  }
}

Working directory sets where relative paths resolve for a stdio command, and Server level decides whether the server is available in every project or only this one. Click OK, then Apply, and watch the Status column. Clicking the status icon shows the List of available tools the server reported, which is the fastest way to tell a live connection from a config typo.

Symvanta is a remote server behind OAuth, and AI Assistant does not run that browser login yet, so its entry uses the STDIO shape with a bridge command. Here is the whole thing.

Setup

  1. Create a free Symvanta account at symvanta.com. Connect GitHub and pick the repositories to index. A webhook reindexes on every push, so the graph tracks the branch you are on. Plans start at $19/month, with a 7-day trial on Pro.
  2. Make sure Node.js 20 or newer is on your PATH. AI Assistant (2026.2) can read a remote MCP server from a plain url over the Streamable HTTP transport, but it does not yet run the OAuth browser login a server like Symvanta needs (tracked as JetBrains issue LLM-25012). The mcp-remote bridge closes that gap: it runs as a local stdio command, performs the OAuth 2.0 (PKCE) login in your browser, and forwards every call to the remote endpoint.
  3. Open Settings > Tools > AI Assistant > Model Context Protocol (MCP), click Add, switch to the JSON view, and paste:
{
  "mcpServers": {
    "symvanta": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://mcp.symvanta.com/mcp"]
    }
  }
}
  1. The first tool call opens a browser window for the OAuth login. Approve it once; mcp-remote caches the token locally (under ~/.mcp-auth) and reuses it on later calls. Restart the IDE window if AI Assistant does not pick up the new server right away.

For Junie, open Settings > Tools > Junie > MCP Settings, click Add, and put the same mcpServers block in the mcp.json that opens. Junie reads the identical format, so one config covers both surfaces. Reload the IDE window for it to take effect.

When native remote-OAuth support ships in AI Assistant, you can drop the bridge and point a url entry straight at https://mcp.symvanta.com/mcp. Until then, the npx mcp-remote command is the path that runs the login end to end, with no API key to paste and no static header to manage.

What the agent gets

Tool What the agent gets
find_node Exact symbol definition, file, and signature, no pattern-matching
relate (callers / dependencies / blast_radius / implementers) Real callers, what a symbol depends on, what breaks if it changes, what implements an interface
ask_codebase Behavior questions ("how does X work") answered with cited files
locate Text, semantic, or config-key search across the repo
find_http_route The handler behind a route path and HTTP method
list_file_symbols Every symbol declared in a given file
map Architecture skeleton of a repo or module before diving in
estimate_scope Rough sizing of a change before the agent commits to a plan

The graph covers TypeScript, JavaScript, Python, Java, Kotlin, C#, Go, Rust, Swift, PHP, and Ruby, so an IntelliJ Java project, a PyCharm service, and a WebStorm frontend in the same workspace all keep coverage across the language boundary. These are 8 of the 25 tools Symvanta exposes over MCP; the rest cover history, freshness checks, and library-level lookups.

Blast radius before you touch a shared function

Say Junie is asked to change the signature of a shared validateInput helper used by both the payment flow and the auth flow, three modules apart, in a project no one has fully memorized. The IDE's own search finds every line containing validateInput, including a comment and an unrelated method with the same name on a different class. It does not tell the agent which calls are real.

With Symvanta wired in, the agent calls relate with kind: blast_radius on the function first. That returns the actual call sites across both flows, including any that route through an interface with a different name at the call site, before a single line changes. The same holds for routing: if two controllers define near-duplicate handlers for /api/users/:id, find_http_route resolves the exact one that method and path hit.

We cover why this distinction exists in code embeddings vs. code graph and blast radius analysis, and you can see the same graph applied to real open-source repos on the architecture pages.

Frequently asked questions

Does AI Assistant handle the OAuth login for a remote MCP server on its own?

Not yet. Native OAuth 2.0 for remote MCP connections is an open JetBrains request (LLM-25012), so AI Assistant today accepts a direct url only for servers that sit behind a static token. Symvanta uses OAuth 2.0 (PKCE), and the mcp-remote bridge runs that browser login for you and caches the token, which is why the config above uses an npx command instead of a bare url. When native support ships you can switch to the url entry.

Does this work across all the JetBrains IDEs, or just IntelliJ IDEA?

Yes. MCP support lives in the shared IntelliJ platform, so the AI Assistant and Junie MCP settings appear the same way in PyCharm, WebStorm, GoLand, PhpStorm, RubyMine, Rider, and CLion on 2026.2 and newer. The same mcpServers block works in every one.

Is my code used to train anything?

No. Symvanta parses your repository into a graph of symbols and relationships. Source code is discarded by default after parsing, not retained or used for training. An Enterprise source-storage add-on exists for teams that specifically want raw source persisted and queryable.

What does this cost?

Starter is $19/month. Pro is $29 per seat per month with a 7-day trial. Enterprise is $99 per seat per month with a 15-seat minimum and adds an on-prem bundle. MCP access is included at every tier, with no separate charge for the JetBrains connection.

Book a 15-minute demo

See Symvanta on your own codebase →