sai-roadmap-mcp
This server exposes Sai Chintamani's professional portfolio and AI engineering roadmap as callable tools, allowing you to query his background, skills, and learning plans.
get_profile: Retrieve basic profile information about Sai Chintamani.get_certifications: Browse all certifications, optionally filtered by a skill keyword (e.g.,'Python','AI','SQL').get_projects: Explore portfolio projects, optionally filtered by a technology in the stack (e.g.,'React','FastAPI').get_roadmap: View the 2026 AI engineering learning roadmap, optionally filtered by quarter (Q1āQ4).semantic_search: Perform semantic retrieval across certifications, project descriptions, and roadmap entries using a natural language query, powered by a custom TF-IDF + truncated SVD (LSA) engine built with Python/NumPy.
Click on "Deploy 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., "@sai-roadmap-mcpWhat Python certifications does Sai have?"
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.
š SAI Roadmap MCP
An MCP (Model Context Protocol) server exposing my certifications, projects, and AI engineering roadmap as callable tools ā including a semantic search engine built entirely from scratch.
š» Core Technologies & Animated Architecture
š 1. High-Level Ecosystem (MCP Server Topology)
graph TB
%% Core Styling with High-Contrast Cyber Theme
classDef client fill:#0f172a,stroke:#38bdf8,stroke-width:3px,color:#fff,stroke-dasharray: 5 5
classDef server fill:#1e1b4b,stroke:#a855f7,stroke-width:3px,color:#fff
classDef python fill:#064e3b,stroke:#34d399,stroke-width:3px,color:#fff
classDef data fill:#451a03,stroke:#fbbf24,stroke-width:3px,color:#fff
%% Clients
subgraph Clients [MCP Clients]
ClaudeDesk[Claude Desktop App]:::client
ClaudeCode[Claude Code CLI]:::client
end
%% Node Server
subgraph NodeServer [Node.js MCP Server]
StdioTransport((stdio / JSON-RPC 2.0)):::server
ToolRouter{Tool Router}:::server
ProfileTool[get_profile]:::server
CertTool[get_certifications]:::server
ProjTool[get_projects]:::server
RoadmapTool[get_roadmap]:::server
SearchTool[semantic_search]:::server
end
%% Python Backend
subgraph PythonEngine [Python ML Subprocess]
QueryParser[LSA Query Parser]:::python
LSAWeights[(lsa_model.npz)]:::data
MergeSet[(Bigram Merge Set)]:::data
PortfolioData[(data.json)]:::data
end
%% Flow Mapping
Clients == "stdio (JSON-RPC)" ==> StdioTransport
StdioTransport --> ToolRouter
ToolRouter --> ProfileTool
ToolRouter --> CertTool
ToolRouter --> ProjTool
ToolRouter --> RoadmapTool
ToolRouter ==> SearchTool
SearchTool -.->|Spawns Child Process| PythonEngine
QueryParser <--> LSAWeights
QueryParser <--> MergeSet
QueryParser <--> PortfolioDataā” 2. Animated Interaction Sequence (Semantic Search ML Pipeline)
sequenceDiagram
autonumber
participant U as User Query (MCP Client)
participant N as Node.js Server
participant P as Python LSA Engine (query.py)
participant C as Corpus Builder
participant M as Truncated SVD Math
Note over C, M: Build Time (npm run train)
C->>C: Extract 51 Sentences from Portfolio
C->>C: Calculate PMI & Merge Bigrams (min_count=3)
C->>M: Apply Explicit TF-IDF Weighting
M->>M: Compute numpy.linalg.svd (Truncated)
M-->>C: Save lsa_model.npz & Bigrams
Note over U, P: Runtime Execution
U->>N: Call `semantic_search`
activate N
N->>P: Spawn process with query args
activate P
P->>P: Apply identical Bigram merges to query
P->>P: Project Query into Latent Space
P->>P: Compute Cosine Similarity vs Corpus
P-->>N: Return JSON matching documents
deactivate P
N-->>U: Return Formatted Result to Claude
deactivate NBuilt on the official @modelcontextprotocol/sdk (v1.29.0), stdio transport, with a Python/NumPy subprocess powering the ML tool.
Related MCP server: A2A MCP Server
Tools
Tool | Description | Optional Input |
| Basic profile info | ā |
| Certifications, filterable by skill |
|
| Portfolio projects, filterable by tech stack |
|
| 2026 learning roadmap, filterable by quarter |
|
| Real semantic retrieval, not keyword matching |
|
The semantic search engine
Pipeline (full implementation in src/ml/lsa.py):
Corpus (
src/ml/corpus.py) ā 51 natural-language sentences generated from certifications, detailed project descriptions, and roadmap entries.Bigram phrase detection ā pointwise mutual information (PMI), the same idea behind word2vec's original
word2phrasetool. Merges tightly-bound word pairs (machine_learning,medireach_ai,artificial_intelligence) into single tokens before training.TF-IDF weighting ā term frequency Ć smoothed inverse document frequency, computed explicitly.
Truncated SVD ā
numpy.linalg.svd, manually truncated to the top-k singular vectors (the actual Latent Semantic Analysis step ā notsklearn.fit_transform()).Cosine similarity in the resulting latent space ranks documents against a query.
Two things I got wrong on the first pass, and fixed
Bigram threshold, take one: my first PMI threshold (min_count=2, threshold=3.0) merged 147 bigrams ā almost all of them grammatical glue like of_the, by_google, is_a, not real phrases. The bug: with only 51 sentences, raw PMI is noisy, and stopwords weren't excluded from forming pairs. Fixed by excluding stopwords from bigram formation and raising the bar to min_count=3, threshold=15.0 ā now produces 19 bigrams, and every single one is a genuine phrase (machine_learning, google_cloud, vibe_coding, iit_bombay).
Query/training vocabulary mismatch: after adding bigram merging, queries were still being tokenized with plain word-splitting ā so a query like "machine learning" stayed as two tokens while the trained vocabulary only had the merged machine_learning. Silent mismatch, no error thrown, just quietly worse retrieval. Fixed by persisting the learned merge set alongside the model and applying it identically at query time (apply_bigram_merges() in corpus.py).
Quantitative evaluation ā precision@k
Most small ML side-projects show a few queries that "look like they work." src/ml/evaluate.py instead defines 10 hand-labeled queries with explicit relevance judgments and reports precision@k:
Query P@1 P@3 P@5
----------------------------------------------------------------------
python certifications 1.00 1.00 0.80
cloud computing certifications 1.00 0.67 0.40
multi agent healthcare assistant 1.00 1.00 1.00
edtech platform for students 1.00 1.00 1.00
frontend animation and design 0.00 0.00 0.00
hackathon and competition experience 0.00 0.00 0.00
SQL and database skills 0.00 0.00 0.00
generative AI and large language models 1.00 0.67 0.40
deep learning quarter in the roadmap 0.00 0.67 0.40
agentic IDE development tools 1.00 1.00 0.60
----------------------------------------------------------------------
MEAN 0.60 0.60 0.46Three queries scored zero ā here's exactly why, diagnosed rather than hand-waved:
"frontend animation and design"ā query contains "animation" (singular); the corpus only ever says "animations" (plural). Out-of-vocabulary, no signal. This is the classic bag-of-words weakness ā no stemming, no lemmatization."hackathon and competition experience"ā same issue: "competition" and "experience" never appear in the corpus at all (it says "Hackathon," not "competition")."SQL and database skills"ā no OOV words here, but a genuine ranking failure:idf("skills") == idf("database")(both 3.833) because both happen to appear in exactly one document ā IDF can't tell "rare and topically specific" apart from "rare by coincidence" at this corpus size. The word "skills" then drags the ranking toward the wrong (but skills-heavy) document.
These are real, well-understood limitations of small-corpus bag-of-words retrieval, not implementation bugs ā and documenting them precisely is more useful than a misleadingly clean demo.
Revisiting word2vec with the bigger corpus
I expanded the corpus 3Ć (17 ā 51 sentences) partly to test whether word-level skip-gram (still in src/ml/word2vec.py, Mikolov et al. 2013, negative sampling, full from-scratch NumPy training) would become viable. Honest result: no.
'cloud' -> [('computing', 0.746), ('oac', 0.728), ('analytics', 0.698), ('infrastructure', 0.645)] ā coherent
'python' -> [('generative_ai', 0.684), ('workflow', 0.599), ('sql', 0.595)] ā noise
'agents' -> [('good', 0.687), ('intensive', 0.681), ('5', 0.636)] ā noise"cloud" produces a genuinely sensible neighborhood; "python" and "agents" still don't. 51 sentences is closer to viable than 17 was, but word2vec realistically needs thousands of sentences minimum. LSA remains the correct choice for this corpus size ā confirmed by actually re-running the experiment, not just assumed.
Setup
git clone https://github.com/saichintamani/sai-roadmap-mcp.git
cd sai-roadmap-mcp
npm install
pip3 install -r requirements.txt --break-system-packages
npm run train # builds corpus, detects bigrams, trains LSA model
npm run evaluate # runs the precision@k evaluation aboveRunning standalone
npm startCommunicates over stdio via JSON-RPC 2.0. Ready message goes to stderr; stdout is reserved for protocol messages.
Connecting to Claude Desktop
{
"mcpServers": {
"sai-roadmap": {
"command": "node",
"args": ["/absolute/path/to/sai-roadmap-mcp/src/index.js"]
}
}
}Connecting to Claude Code
claude mcp add sai-roadmap -- node /absolute/path/to/sai-roadmap-mcp/src/index.jsRepo structure
sai-roadmap-mcp/
āāā src/
ā āāā index.js # MCP server: 5 tools, stdio transport
ā āāā data.json # Structured portfolio data
ā āāā ml/
ā āāā corpus.py # Sentence generation + PMI bigram detection
ā āāā word2vec.py # Skip-gram + negative sampling (kept, documented as non-viable here)
ā āāā lsa.py # TF-IDF + truncated SVD -- the model actually used
ā āāā train.py # Trains and saves the model + merge set
ā āāā query.py # CLI query interface, called by index.js
ā āāā evaluate.py # Precision@k evaluation against hand-labeled queries
ā āāā lsa_model.npz # Pre-trained weights
āāā requirements.txt
āāā package.json
āāā README.mdWhy this exists
Most student AI portfolios show using an LLM API. This shows three different things: understanding of the MCP protocol layer production AI tools run on; a working classical NLP/ML retrieval system built from first principles; and ā maybe more importantly ā the engineering discipline to measure it, find the failure modes, and document them precisely instead of cherry-picking examples that look good.
License
MIT
Available Tools
4 toolsget_certificationsGet CertificationsA
Returns Sai Chintamani's certifications. Optionally filter by a skill keyword (e.g. 'Python', 'AI', 'SQL').
| Name | Required | Description | Default |
|---|---|---|---|
| skill | No | Optional skill keyword to filter certifications by |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Description clearly states the output (certifications) and optional filtering. Missing details on data freshness or pagination, but for a simple read operation it is adequate.
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?
Single sentence, no unnecessary words. Front-loaded with main action and provides filtering option efficiently.
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?
For a simple retrieval tool with one optional parameter, the description is sufficient. Lacks output schema, but overall complete enough for an agent to understand what it returns.
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?
Only one parameter 'skill' with description that aligns with schema. Schema coverage is 100%, so baseline is 3. Description adds no significant extra meaning beyond the schema.
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?
Clearly states the tool returns Sai Chintamani's certifications and mentions optional skill filter. Distinguishes from sibling tools (get_profile, get_projects, get_roadmap) by focusing on a specific resource type.
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?
Implicitly clear that this tool is for retrieving certifications of Sai Chintamani. Though it lacks explicit 'use this when' instructions or comparisons to siblings, the context is straightforward.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_profileGet ProfileA
Returns Sai Chintamani's basic profile information.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits, but it only states the output. No information about idempotency, authentication, side effects, or data source is provided.
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 a single, efficient sentence with no redundancy. It is appropriately concise for a simple tool.
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 zero parameters and no output schema, the description is minimal but acceptable. However, it could be improved by listing typical fields in the profile for better agent 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?
No parameters exist, so schema coverage is 100%. Baseline for 0 parameters is 4; description adds no parameter info but is not required to.
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 returns 'Sai Chintamani's basic profile information,' specifying the verb 'returns' and the resource. This distinguishes it from sibling tools like get_certifications, which focus on other aspects.
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?
No guidance on when to use this tool versus alternatives. It does not mention prerequisites, context, or comparative use cases with sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_projectsGet ProjectsA
Returns Sai Chintamani's portfolio projects. Optionally filter by a technology in the stack (e.g. 'React', 'FastAPI').
| Name | Required | Description | Default |
|---|---|---|---|
| tech | No | Optional technology keyword to filter projects by |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the main behavior (returns projects with optional filtering). No annotations are provided, so it carries the full burden, but it does not mention any side effects or output format. Still, it is transparent enough for a read-only portfolio tool.
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 extremely concise, consisting of two sentences with no extraneous information. Every sentence adds value.
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 output schema and the simple nature of the tool, the description is mostly complete. It could benefit from mentioning that the result is a list of projects, but the current text is adequate for usage.
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 coverage is 100% and the description adds value by providing concrete examples (e.g., 'React', 'FastAPI') for the 'tech' parameter, going beyond what the schema alone offers.
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 'Returns' and the resource 'Sai Chintamani's portfolio projects', and differentiates from sibling tools by specifying projects rather than certifications, profile, or roadmap.
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 indicates when to use this tool (to retrieve portfolio projects) but does not explicitly state when not to use it or provide alternatives. However, the context of sibling tools makes the usage relatively clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_roadmapGet Learning RoadmapA
Returns Sai Chintamani's 2026 AI engineering learning roadmap. Optionally filter to a specific quarter (Q1, Q2, Q3, or Q4).
| Name | Required | Description | Default |
|---|---|---|---|
| quarter | No | Optional quarter to filter the roadmap to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so description carries full burden. Describes read operation but lacks details on side effects, data freshness, or completeness. Adequate but not rich.
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?
Two concise sentences with front-loaded purpose. No wasted words or redundancy.
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?
Simple tool with one optional param, no output schema. Description covers what's returned and filtering, but could mention return structure for full completeness.
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 coverage is 100% with description of quarter parameter. Description adds value by listing allowed values (Q1-Q4) and clarifying they are quarters of the year.
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?
Clearly specifies verb 'Returns', resource 'Sai Chintamani's 2026 AI engineering learning roadmap', and optional filtering by quarter. Distinguishes from sibling tools like get_certifications, get_profile, get_projects.
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?
Implied usage from context but no explicit guidance on when to use vs alternatives or when not to use. Lacks exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v1.0.0- First observed
get_certifications - First observed
get_profile - First observed
get_projects - First observed
get_roadmap
TDQS
Scored across 4 tools
Each tool has a clear, distinct purpose: certifications, profile, projects, and roadmap. No overlap or confusion.
All tool names follow a consistent 'get_' + noun pattern, making them predictable and easy to understand.
With 4 tools, the server is well-scoped for a personal portfolio/roadmap. Each tool provides meaningful information without being excessive or insufficient.
The tools cover the main areas (certifications, profile, projects, roadmap). Minor gaps like skills or experience are acceptable for a focused server.
Maintenance
Related MCP Connectors
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
MCP server for building and testing AI agents with multi-model experimentation and insights.
Related MCP Servers
AlicenseNot gradedqualityFmaintenanceAn MCP server that enables dynamic tool registration and execution based on API definitions, providing seamless integration with services like Claude.ai and Cursor.ai.23MIT- FlicenseBqualityDmaintenanceAn MCP server that enables Claude Desktop to communicate with A2A protocol agents, allowing Claude to access extended capabilities through agent interactions.322-
- FlicenseAqualityDmaintenanceMCP server exposing portfolio AI tools including semantic search, evaluation framework, and prompt management, enabling natural language interaction with these services via Claude Desktop.5-
- AlicenseNot gradedqualityCmaintenanceMCP server that bridges AI agents with external tools, APIs, databases, and services, enabling standardized tool execution and resource access.MIT