xmp4 — Semantic code knowledge for your stack
OSS libs in your stack, really used: source, tests, callers. C#, Java, TS, Python, Rust, PHP+.
Should I use this
Quality & Safety
Findings (2)
- LOWin xmp4_source
- LOWin xmp4_symbol_at
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"xmp4": {
"url": "https://mcp.example4.ai/mcp"
}
}
}Remote endpoints
https://mcp.example4.ai/mcpstreamable-httpWhat it can do
Tool inventory
Tools (16)
🟢xmp4_callees(docs, file_path, output_format, page, page_size, ...)
Find direct callees (methods called by) a symbol in a project. Navigate step-by-step by calling xmp4_callees again on interesting results.
Input Schema
{
"type": "object",
"properties": {
"docs": {
"description": "Include docs: none (default) | summary | full (xmp4_info only)",
"nullable": true,
"type": "string"
},
"file_path": {
"description": "File path to disambiguate",
"nullable": true,
"type": "string"
},
"output_format": {
"description": "Output format: Compact (default) or Verbose",
"nullable": true,
"type": "string"
},
"page": {
"default": null,
"description": "Page number (1-based, default 1; ignored by xmp4_info/xmp4_source)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"page_size": {
"default": null,
"description": "Results per page (default 20, max 100)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"project": {
"description": "Project id: 'repo/project' or 'repo/project/language'. Case-insensitive prefix match. Append '/Python'|'/CSharp'|'/Java'|etc. only to disambiguate multi-language projects (e.g. 'django/Django/Python' vs 'django/Django/JavaScript'). 1 match → proceeds; N → warning lists candidates; 0 → do NOT iterate guesses, call xmp4_projects(query=...) once then retry.",
"type": "string"
},
"symbol_name": {
"description": "Symbol name",
"type": "string"
}
},
"required": [
"project",
"symbol_name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "SymbolParams"
}🟢xmp4_callers(docs, file_path, output_format, page, page_size, ...)
Find direct callers of a symbol in a project. Navigate step-by-step by calling xmp4_callers again on interesting results.
Input Schema
{
"type": "object",
"properties": {
"docs": {
"description": "Include docs: none (default) | summary | full (xmp4_info only)",
"nullable": true,
"type": "string"
},
"file_path": {
"description": "File path to disambiguate",
"nullable": true,
"type": "string"
},
"output_format": {
"description": "Output format: Compact (default) or Verbose",
"nullable": true,
"type": "string"
},
"page": {
"default": null,
"description": "Page number (1-based, default 1; ignored by xmp4_info/xmp4_source)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"page_size": {
"default": null,
"description": "Results per page (default 20, max 100)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"project": {
"description": "Project id: 'repo/project' or 'repo/project/language'. Case-insensitive prefix match. Append '/Python'|'/CSharp'|'/Java'|etc. only to disambiguate multi-language projects (e.g. 'django/Django/Python' vs 'django/Django/JavaScript'). 1 match → proceeds; N → warning lists candidates; 0 → do NOT iterate guesses, call xmp4_projects(query=...) once then retry.",
"type": "string"
},
"symbol_name": {
"description": "Symbol name",
"type": "string"
}
},
"required": [
"project",
"symbol_name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "SymbolParams"
}🟢xmp4_deps(output_format, page, page_size, project)
List external dependencies of a project.
Input Schema
{
"type": "object",
"properties": {
"output_format": {
"description": "Output format: Compact (default) or Verbose",
"nullable": true,
"type": "string"
},
"page": {
"default": null,
"description": "Page number (1-based, default 1)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"page_size": {
"default": null,
"description": "Results per page (default 20, max 100)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"project": {
"description": "Project id: 'repo/project' or 'repo/project/language'. Case-insensitive prefix match. Append '/Python'|'/CSharp'|'/Java'|etc. only to disambiguate multi-language projects (e.g. 'django/Django/Python' vs 'django/Django/JavaScript'). 1 match → proceeds; N → warning lists candidates; 0 → do NOT iterate guesses, call xmp4_projects(query=...) once then retry.",
"type": "string"
}
},
"required": [
"project"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "RepoParams"
}🟢xmp4_grep(case_sensitive, file_glob, file_path, max_results, page, ...)
Server-side regex text search over indexed project source files. Free tier: requires file_path (single file). Premium tier (XMP4_PREMIUM_GREP_WALK=true): allows file_glob multi-file walk. Prefer xmp4_tests_for/xmp4_usages for SCIP symbols — grep is for text not indexed (comments, literals, config keys).
Input Schema
{
"type": "object",
"properties": {
"case_sensitive": {
"description": "If true, search is case-sensitive (default false)",
"nullable": true,
"type": "boolean"
},
"file_glob": {
"description": "Optional file glob for multi-file walk (premium tier). Set XMP4_PREMIUM_GREP_WALK=true to enable.",
"nullable": true,
"type": "string"
},
"file_path": {
"description": "Single-file grep target, repo-relative (e.g. 'src/foo.rs'). Required in free tier.",
"nullable": true,
"type": "string"
},
"max_results": {
"default": null,
"description": "Maximum number of hits to collect before pagination (default 50, max 1000)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"page": {
"default": null,
"description": "Page number (1-based, default 1)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"page_size": {
"default": null,
"description": "Results per page (default 20, max 100)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"pattern": {
"description": "Regex pattern (case-insensitive by default)",
"type": "string"
},
"project": {
"description": "Project id: 'repo/project' or 'repo/project/language'. Case-insensitive prefix match. Append '/Python'|'/CSharp'|'/Java'|etc. only to disambiguate multi-language projects (e.g. 'django/Django/Python' vs 'django/Django/JavaScript'). 1 match → proceeds; N → warning lists candidates; 0 → do NOT iterate guesses, call xmp4_projects(query=...) once then retry.",
"type": "string"
}
},
"required": [
"project",
"pattern"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "GrepParams"
}🟢xmp4_guide
Usage guide for xmp4 tools — read this first to learn the correct workflow
Input Schema
{
"type": "object",
"properties": {}
}🟢xmp4_hierarchy(docs, file_path, output_format, page, page_size, ...)
Get type hierarchy (base, interfaces, derived) for a symbol in a project.
Input Schema
{
"type": "object",
"properties": {
"docs": {
"description": "Include docs: none (default) | summary | full (xmp4_info only)",
"nullable": true,
"type": "string"
},
"file_path": {
"description": "File path to disambiguate",
"nullable": true,
"type": "string"
},
"output_format": {
"description": "Output format: Compact (default) or Verbose",
"nullable": true,
"type": "string"
},
"page": {
"default": null,
"description": "Page number (1-based, default 1; ignored by xmp4_info/xmp4_source)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"page_size": {
"default": null,
"description": "Results per page (default 20, max 100)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"project": {
"description": "Project id: 'repo/project' or 'repo/project/language'. Case-insensitive prefix match. Append '/Python'|'/CSharp'|'/Java'|etc. only to disambiguate multi-language projects (e.g. 'django/Django/Python' vs 'django/Django/JavaScript'). 1 match → proceeds; N → warning lists candidates; 0 → do NOT iterate guesses, call xmp4_projects(query=...) once then retry.",
"type": "string"
},
"symbol_name": {
"description": "Symbol name",
"type": "string"
}
},
"required": [
"project",
"symbol_name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "SymbolParams"
}🟢xmp4_info(docs, file_path, output_format, page, page_size, ...)
Get detailed information about a symbol in a project.
Input Schema
{
"type": "object",
"properties": {
"docs": {
"description": "Include docs: none (default) | summary | full (xmp4_info only)",
"nullable": true,
"type": "string"
},
"file_path": {
"description": "File path to disambiguate",
"nullable": true,
"type": "string"
},
"output_format": {
"description": "Output format: Compact (default) or Verbose",
"nullable": true,
"type": "string"
},
"page": {
"default": null,
"description": "Page number (1-based, default 1; ignored by xmp4_info/xmp4_source)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"page_size": {
"default": null,
"description": "Results per page (default 20, max 100)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"project": {
"description": "Project id: 'repo/project' or 'repo/project/language'. Case-insensitive prefix match. Append '/Python'|'/CSharp'|'/Java'|etc. only to disambiguate multi-language projects (e.g. 'django/Django/Python' vs 'django/Django/JavaScript'). 1 match → proceeds; N → warning lists candidates; 0 → do NOT iterate guesses, call xmp4_projects(query=...) once then retry.",
"type": "string"
},
"symbol_name": {
"description": "Symbol name",
"type": "string"
}
},
"required": [
"project",
"symbol_name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "SymbolParams"
}🟢xmp4_outline(file_path, output_format, page, page_size, project)
Get outline (all symbols) for a file in a project.
Input Schema
{
"type": "object",
"properties": {
"file_path": {
"description": "File path",
"type": "string"
},
"output_format": {
"description": "Output format: Compact (default) or Verbose",
"nullable": true,
"type": "string"
},
"page": {
"default": null,
"description": "Page number (1-based, default 1)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"page_size": {
"default": null,
"description": "Results per page (default 20, max 100)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"project": {
"description": "Project id: 'repo/project' or 'repo/project/language'. Case-insensitive prefix match. Append '/Python'|'/CSharp'|'/Java'|etc. only to disambiguate multi-language projects (e.g. 'django/Django/Python' vs 'django/Django/JavaScript'). 1 match → proceeds; N → warning lists candidates; 0 → do NOT iterate guesses, call xmp4_projects(query=...) once then retry.",
"type": "string"
}
},
"required": [
"project",
"file_path"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "OutlineParams"
}🟢xmp4_projects(language, page, page_size, query, repo)
Search and browse projects by language and name. Use this first to discover projects, then use other tools with the repo name.
Input Schema
{
"type": "object",
"properties": {
"language": {
"description": "Filter by language (e.g., Python, TypeScript, CSharp)",
"nullable": true,
"type": "string"
},
"page": {
"default": null,
"description": "Page number (1-based, default 1)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"page_size": {
"default": null,
"description": "Results per page (default 20, max 100)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"query": {
"description": "Search by project name (case-insensitive contains)",
"nullable": true,
"type": "string"
},
"repo": {
"description": "Filter by repository name",
"nullable": true,
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "ProjectsParams"
}🟢xmp4_search(kind, max_results, output_format, page, page_size, ...)
Search symbols in a project. Use xmp4_projects first to find the project identifier.
Input Schema
{
"type": "object",
"properties": {
"kind": {
"description": "Filter by kind: Class, Method, Function, etc.",
"nullable": true,
"type": "string"
},
"max_results": {
"default": null,
"description": "Maximum results to return (default: 50). Kept as per-page upper bound alongside page_size.",
"format": "uint",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"output_format": {
"description": "Output format: Compact (default) or Verbose",
"nullable": true,
"type": "string"
},
"page": {
"default": null,
"description": "Page number (1-based, default 1)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"page_size": {
"default": null,
"description": "Results per page (default 20, max 100)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"project": {
"description": "Project id: 'repo/project' or 'repo/project/language'. Case-insensitive prefix match. Append '/Python'|'/CSharp'|'/Java'|etc. only to disambiguate multi-language projects (e.g. 'django/Django/Python' vs 'django/Django/JavaScript'). 1 match → proceeds; N → warning lists candidates; 0 → do NOT iterate guesses, call xmp4_projects(query=...) once then retry.",
"type": "string"
},
"query": {
"description": "Search query (symbol name or pattern)",
"type": "string"
}
},
"required": [
"project",
"query"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "SearchParams"
}🟢xmp4_server
Get server information, version, and capabilities
Input Schema
{
"type": "object",
"properties": {}
}🟢xmp4_source(docs, file_path, output_format, page, page_size, ...)
Extract source code for a symbol in a project.
Input Schema
{
"type": "object",
"properties": {
"docs": {
"description": "Include docs: none (default) | summary | full (xmp4_info only)",
"nullable": true,
"type": "string"
},
"file_path": {
"description": "File path to disambiguate",
"nullable": true,
"type": "string"
},
"output_format": {
"description": "Output format: Compact (default) or Verbose",
"nullable": true,
"type": "string"
},
"page": {
"default": null,
"description": "Page number (1-based, default 1; ignored by xmp4_info/xmp4_source)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"page_size": {
"default": null,
"description": "Results per page (default 20, max 100)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"project": {
"description": "Project id: 'repo/project' or 'repo/project/language'. Case-insensitive prefix match. Append '/Python'|'/CSharp'|'/Java'|etc. only to disambiguate multi-language projects (e.g. 'django/Django/Python' vs 'django/Django/JavaScript'). 1 match → proceeds; N → warning lists candidates; 0 → do NOT iterate guesses, call xmp4_projects(query=...) once then retry.",
"type": "string"
},
"symbol_name": {
"description": "Symbol name",
"type": "string"
}
},
"required": [
"project",
"symbol_name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "SymbolParams"
}🟢xmp4_symbol_at(column, file_path, line, project)
LSP-style position→symbol lookup. Given (file_path, line, column) returns the symbol whose occurrence covers that cursor position. line is 1-based; column is 0-based. Use after xmp4_outline/xmp4_view when you know coordinates and want the canonical symbol.
Input Schema
{
"type": "object",
"properties": {
"column": {
"default": null,
"description": "Column number (0-based, default 0 = beginning of line)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"file_path": {
"description": "File path inside the project, relative to repo root",
"type": "string"
},
"line": {
"default": null,
"description": "Line number (1-based)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"project": {
"description": "Project id: 'repo/project' or 'repo/project/language'. Case-insensitive prefix match. Append '/Python'|'/CSharp'|'/Java'|etc. only to disambiguate multi-language projects (e.g. 'django/Django/Python' vs 'django/Django/JavaScript'). 1 match → proceeds; N → warning lists candidates; 0 → do NOT iterate guesses, call xmp4_projects(query=...) once then retry.",
"type": "string"
}
},
"required": [
"project",
"file_path"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "SymbolAtParams"
}🟢xmp4_tests_for(docs, file_path, output_format, page, page_size, ...)
Find direct tests that exercise a given symbol (direct callers filtered to test-file candidates per language pattern: CSharp/Java/PHP: *Test(s).<ext>; Python: test_*.py / *_test.py; TypeScript/JavaScript: *.spec/test.{ts,js}; Rust: *_tests.rs / tests/; etc.).
Input Schema
{
"type": "object",
"properties": {
"docs": {
"description": "Include docs: none (default) | summary | full (xmp4_info only)",
"nullable": true,
"type": "string"
},
"file_path": {
"description": "File path to disambiguate",
"nullable": true,
"type": "string"
},
"output_format": {
"description": "Output format: Compact (default) or Verbose",
"nullable": true,
"type": "string"
},
"page": {
"default": null,
"description": "Page number (1-based, default 1; ignored by xmp4_info/xmp4_source)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"page_size": {
"default": null,
"description": "Results per page (default 20, max 100)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"project": {
"description": "Project id: 'repo/project' or 'repo/project/language'. Case-insensitive prefix match. Append '/Python'|'/CSharp'|'/Java'|etc. only to disambiguate multi-language projects (e.g. 'django/Django/Python' vs 'django/Django/JavaScript'). 1 match → proceeds; N → warning lists candidates; 0 → do NOT iterate guesses, call xmp4_projects(query=...) once then retry.",
"type": "string"
},
"symbol_name": {
"description": "Symbol name",
"type": "string"
}
},
"required": [
"project",
"symbol_name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "SymbolParams"
}🟢xmp4_usages(docs, file_path, output_format, page, page_size, ...)
Find all usages/references of a symbol in a project.
Input Schema
{
"type": "object",
"properties": {
"docs": {
"description": "Include docs: none (default) | summary | full (xmp4_info only)",
"nullable": true,
"type": "string"
},
"file_path": {
"description": "File path to disambiguate",
"nullable": true,
"type": "string"
},
"output_format": {
"description": "Output format: Compact (default) or Verbose",
"nullable": true,
"type": "string"
},
"page": {
"default": null,
"description": "Page number (1-based, default 1; ignored by xmp4_info/xmp4_source)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"page_size": {
"default": null,
"description": "Results per page (default 20, max 100)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"project": {
"description": "Project id: 'repo/project' or 'repo/project/language'. Case-insensitive prefix match. Append '/Python'|'/CSharp'|'/Java'|etc. only to disambiguate multi-language projects (e.g. 'django/Django/Python' vs 'django/Django/JavaScript'). 1 match → proceeds; N → warning lists candidates; 0 → do NOT iterate guesses, call xmp4_projects(query=...) once then retry.",
"type": "string"
},
"symbol_name": {
"description": "Symbol name",
"type": "string"
}
},
"required": [
"project",
"symbol_name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "SymbolParams"
}🟢xmp4_view(file_path, from_line, project, to_line)
Read a raw file excerpt from an indexed project by line range. Use after xmp4_search/xmp4_outline locates the region of interest, or to expand a truncated xmp4_source snippet. Hard cap of 500 lines per call.
Input Schema
{
"type": "object",
"properties": {
"file_path": {
"description": "File path inside the project, relative to repo root",
"type": "string"
},
"from_line": {
"default": null,
"description": "Starting line (1-based, default 1)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
},
"project": {
"description": "Project id: 'repo/project' or 'repo/project/language'. Case-insensitive prefix match. Append '/Python'|'/CSharp'|'/Java'|etc. only to disambiguate multi-language projects (e.g. 'django/Django/Python' vs 'django/Django/JavaScript'). 1 match → proceeds; N → warning lists candidates; 0 → do NOT iterate guesses, call xmp4_projects(query=...) once then retry.",
"type": "string"
},
"to_line": {
"default": null,
"description": "Ending line (inclusive, default from_line+49, hard cap 500 lines per call)",
"format": "uint32",
"minimum": 0,
"nullable": true,
"type": "integer"
}
},
"required": [
"project",
"file_path"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "ViewParams"
}Recommended Prompts
xmp4_searchxmp4_searchCommunity
Evidence