// model context protocol
Anvilry MCP server: ask your own AI about me
This portfolio runs a small MCP server — the same protocol AI assistants use to call tools. Connect it to Claude Desktop or Cursor and ask your own AI about my work; it answers from my real projects and résumé.
Read-only · grounded in the same content as this site · no LLM cost on the server · it can only return real data, never invent.
// endpoint
https://anvilry.vercel.app/api/mcp/mcp
// Claude Desktop
{
"mcpServers": {
"sairam-portfolio": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://anvilry.vercel.app/api/mcp/mcp"]
}
}
}// Cursor
{
"mcpServers": {
"sairam-portfolio": { "url": "https://anvilry.vercel.app/api/mcp/mcp" }
}
}// tools
| tool | what it returns |
|---|---|
| get_profile | Identity, headline, links, skills, achievements. sections (list, each one of identity, links, skills, achievements, optional): Which parts of the profile to return: identity (name, role, company, tenure, location, headline, summary), links, skills, achievements. Omit to get all four. |
| list_projects | All open-source projects. group (string, up to 80 characters, optional): Return only the projects in this group. The rule is an exact match on the whole group name, case-insensitive and ignoring surrounding spaces, e.g. 'Tooling & Lab'. An unknown name (text of only spaces included) returns an error that lists the valid groups; the empty string is rejected. Omit for every group. limit (integer, 1 to 100, optional): Maximum number of projects to return, from 1 to 100. Omit for all of them. |
| get_project | One project's detail by slug. slug (string, required): project slug, e.g. mindforge |
| list_work | Production work case studies. tech (string, up to 60 characters, optional): Return only the case studies whose tech list has an entry containing this text. The rule is a case-insensitive substring match against each entry, e.g. 'python' or 'sse'. Text of only spaces applies no filter; the empty string is rejected. Omit for all of them. limit (integer, 1 to 50, optional): Maximum number of case studies to return, from 1 to 50. Omit for all of them. |
| get_work | One case study's detail by slug. slug (string, required): work slug, e.g. pensieve |
| search_experience | Keyword search across work, projects, skills. query (string, up to 120 characters, required): Keywords, e.g. 'kafka' or 'multi-agent'. The rule is a case-insensitive substring match of the whole query as one phrase (not word by word) against work, project and skill text. |
| get_resume_variant | The canonical résumé PDF URL. role (one of master, required): target role flavor for the résumé variant |
| list_all_content | Every work item, project, article and note — slug, name, summary, URL. type (one of work, project, article, note, optional): Return only this kind of content: work, project, article or note. The rule is an exact match on the item's type. Notes are listed only while the notes section is published. Omit for every kind. limit (integer, 1 to 200, optional): Maximum number of items to return, from 1 to 200. Applied after the type filter. Omit for all of them. |
| get_content_item | One content item by type (work, project, article, note) and slug. type (one of work, project, article, note, required): Kind of content item to fetch: work, project, article or note. slug (string, required): content slug, e.g. 'pensieve' or 'mindforge' |
| list_decisions | Real architecture tradeoffs across projects and work, optionally filtered by tag. tag (string, optional): Return only the decisions carrying this tag. The rule is an exact, case-sensitive match against each tag ('Performance' is not 'performance'); a tag nothing carries returns an empty list, not an error, and the empty string applies no filter. Omit for all of them. |