Nuanced MCP Server
The Nuanced MCP Server enables LLMs to analyze and understand code structure through function call graphs in Python repositories.
Initialize and manage code graphs: Initialize, switch between, and list all initialized repositories
Analyze function relationships: Retrieve call graphs for specific functions and analyze dependencies between functions or modules
Assess change impact: Understand the potential effects of modifying specific functions
Generate prompts: Create prompts for analyzing functions, dependencies, and change impacts
Access summaries: Retrieve overviews of code graphs and detailed function information
Provides call graph analysis tools for Python codebases, allowing for initialization of code graphs, exploration of function call relationships, dependency analysis, and impact assessment of code changes.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Nuanced MCP Serveranalyze the impact of changing the process_data function in utils.py"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Nuanced MCP Server
A Model Context Protocol (MCP) server that provides call graph analysis capabilities to LLMs through the nuanced library.
Overview
This MCP server enables LLMs to understand code structure by accessing function call graphs through standardized tools and resources. It allows AI assistants to:
Initialize call graphs for Python repos
Explore function call relationships
Analyze dependencies between functions
Provide more contextually aware code assistance
Related MCP server: Axon.MCP.Server
API
Tools
initialize_graph
Initialize a code graph for the given repository path
Input:
repo_path(string)
switch_repository
Switch to a different initialized repository
Input:
repo_path(string)
list_repositories
List all initialized repositories
No inputs required
get_function_call_graph
Get the call graph for a specific function
Inputs:
file_path(string)function_name(string)repo_path(string, optional) - uses active repository if not specified
analyze_dependencies
Find all module or file dependencies in the codebase
Inputs (at least one required):
file_path(string, optional)module_name(string, optional)
analyze_change_impact
Analyze the impact of changing a specific function
Inputs:
file_path(string)function_name(string)
Resources
graph://summary
Get a summary of the currently loaded code graph
No parameters required
graph://repo/{repo_path}/summary
Get a summary of a specific repository's code graph
Parameters:
repo_path(string) - Path to the repository
graph://function/{file_path}/{function_name}
Get detailed information about a specific function
Parameters:
file_path(string) - Path to the file containing the functionfunction_name(string) - Name of the function to analyze
Prompts
analyze_function
Create a prompt to analyze a function with its call graph
Parameters:
file_path(string) - Path to the file containing the functionfunction_name(string) - Name of the function to analyze
impact_analysis
Create a prompt to analyze the impact of changing a function
Parameters:
file_path(string) - Path to the file containing the functionfunction_name(string) - Name of the function to analyze
analyze_dependencies_prompt
Create a prompt to analyze dependencies of a file or module
Parameters (at least one required):
file_path(string, optional) - Path to the file to analyzemodule_name(string, optional) - Name of the module to analyze
Usage with Claude Desktop
Add this to your claude_desktop_config.json
UV
{
"mcpServers": {
"nuanced": {
"command": "uv",
"args": [
"--directory",
"/path/to/nuanced-mcp",
"run",
"nuanced_mcp_server.py"
]
}
}
}Available Tools
6 toolsanalyze_change_impactC
Analyze the impact of changing a specific function.
This tool performs a comprehensive impact analysis to help understand what would be affected if you modify the specified function.
Args: file_path: Path to the file containing the function function_name: Name of the function to analyze
Returns: A detailed analysis of the potential impact of changing the function
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes | ||
| function_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It mentions 'comprehensive impact analysis' but doesn't disclose behavioral traits like whether this is a read-only operation, if it requires specific permissions, execution time, rate limits, or what 'impact' entails (e.g., dependencies, side effects). The description is vague about the tool's behavior beyond its basic purpose.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded: the first sentence states the purpose clearly. The Args and Returns sections add structure, though 'Returns' is redundant since it just restates the purpose. No unnecessary sentences, but could be more efficient by integrating parameter info.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, 0% schema coverage, and no output schema, the description is incomplete. It lacks details on what the analysis includes, output format, error conditions, or how it differs from siblings. For a tool with two parameters and potential complexity in impact analysis, this is inadequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It lists both parameters ('file_path' and 'function_name') in the Args section, providing basic semantics. However, it doesn't add meaning beyond naming them—no details on format, constraints, or examples. With 0% coverage, this partial compensation earns a baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Analyze the impact of changing a specific function' and 'performs a comprehensive impact analysis'. It specifies the verb (analyze) and resource (function), but doesn't explicitly differentiate from sibling tools like 'analyze_dependencies' or 'get_function_call_graph', which might have overlapping purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention sibling tools like 'analyze_dependencies' or 'get_function_call_graph', nor does it specify prerequisites, exclusions, or contextual triggers for usage. The only implied usage is when you want to understand impact before modifying a function.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_dependenciesB
Find all module or file dependencies in the codebase.
Identifies all function dependencies for a file or module in the active repository. This identifies all modules that depend on the specified module or file.
Args: file_path: Path to a specific file to analyze dependencies for module_name: Name of a module to analyze dependencies for (e.g., 'auth' will match 'app.auth', 'auth.users', etc.)
Returns: A list of all functions and files that depend on the specified module
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | No | ||
| module_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It describes the tool's function but lacks critical behavioral details: it doesn't mention if this is a read-only operation, what permissions are required, whether it works on saved or unsaved code, how it handles errors, or if there are rate limits. The description is functional but misses key operational context needed for safe and effective use.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded: the first sentence states the core purpose, followed by elaboration and parameter details. It avoids redundancy and uses clear sections (Args, Returns). However, the second sentence is somewhat repetitive of the first, and the structure could be slightly tighter by combining related ideas.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (dependency analysis with 2 parameters) and lack of annotations or output schema, the description is moderately complete. It covers purpose and parameters well but misses behavioral aspects like safety, performance, and error handling. The return value description is vague ('A list of all functions and files'), lacking format details. For a tool with no structured support, this leaves gaps in operational understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds significant meaning beyond the input schema, which has 0% description coverage. It explains that 'file_path' is for a specific file and 'module_name' matches patterns like 'app.auth' or 'auth.users', clarifying how parameters work semantically. This compensates well for the schema's lack of documentation, though it could note that only one parameter should be used at a time or provide examples of valid paths.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Find all module or file dependencies in the codebase' and 'Identifies all function dependencies for a file or module in the active repository.' It specifies the verb ('find', 'identifies') and resource ('dependencies', 'modules/files'), making it easy to understand what the tool does. However, it doesn't explicitly differentiate from siblings like 'analyze_change_impact' or 'get_function_call_graph', which likely have related but distinct purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It mentions analyzing dependencies but doesn't specify scenarios, prerequisites, or exclusions. For example, it doesn't clarify if this should be used for impact analysis vs. 'analyze_change_impact' or for dependency graphs vs. 'get_function_call_graph'. This lack of context leaves the agent guessing about appropriate use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_function_call_graphC
Get the call graph for a specific function.
Args: file_path: Path to the file containing the function function_name: Name of the function to analyze repo_path: Optional repository path (uses active repository if not specified)
Returns: Information about the function's call graph
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes | ||
| function_name | Yes | ||
| repo_path | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool 'Get[s] the call graph' but doesn't explain what a 'call graph' entails, whether it's read-only or has side effects, or any performance or permission considerations. For a tool with no annotations, this leaves significant gaps in understanding its behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections for purpose, arguments, and returns, and it's front-loaded with the main purpose. It's concise with no wasted sentences, though the parameter descriptions could be more detailed without sacrificing brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of analyzing function call graphs, no annotations, no output schema, and low schema description coverage (0%), the description is incomplete. It lacks details on the return format, error handling, or behavioral traits, making it inadequate for a tool with 3 parameters and no structured support.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description includes an 'Args' section that lists and briefly describes the three parameters, adding meaning beyond the input schema, which has 0% description coverage. However, the descriptions are minimal (e.g., 'Path to the file containing the function') and don't provide detailed semantics like format examples or constraints, so it partially compensates but not fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get the call graph for a specific function.' This specifies the verb ('Get') and resource ('call graph'), making it easy to understand what the tool does. However, it doesn't differentiate from sibling tools like 'analyze_dependencies' or 'analyze_change_impact,' which might have overlapping functionality, so it doesn't reach the highest score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention sibling tools like 'analyze_dependencies' or 'analyze_change_impact,' nor does it specify prerequisites or exclusions. The only implied context is analyzing functions, but this is insufficient for effective tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
initialize_graphC
Initialize a code graph for the given repository path.
Args: repo_path: Path to the repository to analyze
Returns: Success message with information about the initialized graph
| Name | Required | Description | Default |
|---|---|---|---|
| repo_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions that the tool initializes a graph and returns a success message, but lacks critical details such as whether this is a one-time setup, if it requires specific permissions, what happens if the graph already exists, or any performance implications. This is inadequate for a mutation tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded, with the core purpose stated first, followed by brief sections for args and returns. Each sentence earns its place, though the structure is minimal and could be more polished.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (initializing a graph, likely a mutation), lack of annotations, no output schema, and low schema coverage, the description is incomplete. It doesn't explain what 'initializing' entails, potential side effects, or error conditions, making it insufficient for safe and effective use by an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 0%, so the description must compensate. It adds meaning by explaining that 'repo_path' is the 'Path to the repository to analyze', which clarifies the parameter's purpose beyond the schema's basic type. However, it doesn't provide format details (e.g., absolute vs. relative paths) or examples, leaving some gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Initialize a code graph for the given repository path.' It specifies the verb ('Initialize') and resource ('code graph'), and while it doesn't explicitly differentiate from siblings like 'analyze_dependencies' or 'get_function_call_graph', the focus on initialization is distinct enough for clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., if the repository must be listed first), exclusions, or how it relates to sibling tools like 'list_repositories' or 'switch_repository', leaving the agent with no usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_repositoriesB
List all initialized repositories.
Returns: List of initialized repositories
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states the tool lists repositories and returns a list, but lacks critical behavioral details: it doesn't specify the format of the returned list (e.g., names, paths, metadata), whether it includes all repositories or only accessible ones, or any permissions required. For a tool with zero annotation coverage, this is a significant gap in transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise with two short sentences that directly state the action and return value. It's front-loaded with the main purpose. However, the second sentence ('Returns: List of initialized repositories') is somewhat redundant with the first, slightly reducing efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and output schema, the description is incomplete. It doesn't explain what 'initialized' means in this context, the structure of the returned list, or any error conditions. For a tool that likely interacts with a repository system, more context on behavior and output is needed to be fully helpful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, and schema description coverage is 100% (since there are no parameters to describe). The description doesn't need to add parameter semantics beyond the schema, so it meets the baseline of 4 for tools with no parameters. It correctly omits any parameter discussion, which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('List') and resource ('initialized repositories'), making the purpose immediately understandable. It distinguishes from siblings like 'analyze_change_impact' or 'get_function_call_graph' by focusing on listing rather than analysis. However, it doesn't explicitly differentiate from 'switch_repository' which might also involve repository selection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., whether repositories must be initialized first), nor does it contrast with siblings like 'switch_repository' for repository selection or 'initialize_graph' for setup. Usage is implied but not explicitly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
switch_repositoryC
Switch to a different initialized repository.
Args: repo_path: Path to the repository to switch to
Returns: Success message or error
| Name | Required | Description | Default |
|---|---|---|---|
| repo_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool switches repositories and returns a success/error message, but lacks details on side effects (e.g., whether this affects other operations), permissions needed, or error conditions. For a mutation tool with zero annotation coverage, this is a significant gap in transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded, with the core purpose stated first. The 'Args' and 'Returns' sections add structure, though they could be more integrated. There's no wasted text, but the lack of detailed guidance slightly reduces efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (a mutation operation with no annotations, 1 parameter at 0% schema coverage, and no output schema), the description is incomplete. It doesn't cover behavioral traits, parameter details, or usage context, making it inadequate for safe and effective agent use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for undocumented parameters. It adds minimal value: it names the parameter ('repo_path') and states it's a 'Path to the repository to switch to,' but doesn't explain format (e.g., absolute vs. relative), examples, or constraints. This is insufficient given the low coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Switch to a different initialized repository.' This specifies the verb ('switch') and resource ('initialized repository'), making it easy to understand what the tool does. However, it doesn't explicitly differentiate from sibling tools like 'list_repositories' or 'initialize_graph,' which prevents a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., that repositories must be initialized first), exclusions, or comparisons with siblings like 'list_repositories' for checking available repos. This leaves the agent without context for proper tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Most tools have distinct purposes: analyze_change_impact focuses on modification consequences, analyze_dependencies finds what depends on a module, get_function_call_graph shows function call relationships, and the last three handle repository management. However, analyze_dependencies and get_function_call_graph could be confused as both involve dependency/call analysis, though their descriptions clarify one is module-level and the other function-level.
The naming follows a consistent verb_noun pattern throughout (e.g., analyze_change_impact, get_function_call_graph, list_repositories), with all tools using snake_case. The only minor deviation is that 'initialize_graph' uses a verb without a clear noun object, but it still fits the overall pattern.
With 6 tools, the count is well-scoped for a code analysis server. It covers core functions like impact analysis, dependency tracking, call graph generation, and repository management, with each tool earning its place without being overwhelming or too sparse.
The server covers key code analysis operations (impact, dependencies, call graphs) and repository management, but there are notable gaps. For example, it lacks tools for updating or deleting initialized repositories, and there's no way to clear or reset graphs, which could leave agents in dead ends when managing repository states.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Hosted code graph over MCP: exact callers, dependencies, and cross-repo blast radius for AI agents.
An MCP server that gives your AI access to the source code and docs of all public github repos
Driflyte MCP server which lets AI assistants query topic-specific knowledge from web and GitHub.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that transforms codebases into knowledge graphs using Neo4J, enabling AI assistants to understand code structure, relationships, and metrics for more context-aware assistance.27MIT
- FlicenseNot gradedqualityDmaintenanceAn MCP server that transforms codebases into intelligent, queryable knowledge bases, enabling AI assistants to perform semantic search, explore architecture, and analyze code relationships.166
- AlicenseNot gradedqualityDmaintenanceMCP server that exposes Python function- and module-level call graphs for agentic coding clients, enabling tools like callers_of, callees_of, and neighborhood queries.MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server that provides ultra-efficient code exploration through AST analysis, reducing LLM token usage by up to 95% while enabling instant call graph generation and dependency analysis for massive codebases.MIT
Appeared in Searches
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mattmorgis/nuanced-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server