Read-only MCP server
An AI client that speaks the Model Context Protocol (MCP) can read my public resume text through this endpoint. It has three tools. None of them can change anything.
The endpoint takes JSON-RPC 2.0 messages over HTTP POST and answers with JSON. It reads the same text as the chat assistant on this site, through the same read-only database role, and every text it returns passes the chat's link, private-word and format guards.
01
Connect
Endpoint: https://sanjaykandimalla.com/api/mcp
Protocol version 2025-06-18. List the tools:
curl -s https://sanjaykandimalla.com/api/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Call one:
curl -s https://sanjaykandimalla.com/api/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"search_resume","arguments":{"query":"RAG pipelines"}}}'02
Tools
search_resume
Search Sanjay Kandimalla's public resume and project notes with a plain-English query, for example "RAG pipelines" or "Python experience". Returns up to 5 short passages, best match first, each with its section heading and a similarity score from 0 to 1. Returns an empty list when nothing is close enough. Read-only.
| Input | Type | Meaning |
|---|---|---|
query | string | What to look for, in plain English. (1 to 200 characters) |
| Output | Type | Meaning |
|---|---|---|
passages | array | Matching passages, best first. May be empty. |
passages[].section | string | Heading of the section the passage comes from. |
passages[].text | string | The passage text. |
passages[].score | number | Similarity from 0 to 1, rounded to one decimal. |
get_section
Return the full public text of one section of the resume, for example "Summary" or "Technical skills". Use search_resume first if you do not know which section you need. The section must be one of the listed values. Read-only.
| Input | Type | Meaning |
|---|---|---|
section | string | Section heading to read. |
| Output | Type | Meaning |
|---|---|---|
section | string | The section heading that was asked for. |
text | string | The section text, one item per line. |
list_evals
List the public evaluation sets that test this site's chat assistant: each set's name, what it checks, and how many cases it has. Takes no arguments. Private test sets are never listed. Read-only.
Input: none.
| Output | Type | Meaning |
|---|---|---|
sets | array | One entry per public eval set. |
sets[].name | string | Set name, for example Golden. |
sets[].tests | string | What the set checks. |
sets[].cases | number | Number of cases in the set. |
03
What it does not do
- No writes. There is no tool that stores, changes or deletes anything.
- No sessions. Every request stands alone, and GET and DELETE are refused.
- No memory. Nothing from one call is kept for the next.
- No answers written by a model. It returns passages of text, and the client decides what to do with them.
- No private notes. Text that fails those guards is left out without explanation.
- No extra allowance. It shares the chat assistant's rate limits, and every request counts, including listing the tools.