saagarpatel.dev Portfolio

Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.

Should I use this

Quality & Safety

A
Description quality
96%
Schema completeness
79%
Naming quality
100%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (1)

  • LOWTool 'get_repo_profile' description lacks action verbin get_repo_profile

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,001Tokens (tool definitions)
~697 BTypical response size
Moderate attention impact (0.78% of 128k context)

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": {
    "portfolio-mcp": {
      "command": "npx",
      "args": [
        "saagar-portfolio-mcp"
      ]
    }
  }
}

Runnable packages

npmsaagar-portfolio-mcp0.1.0stdio

Remote endpoints

https://mcp.saagarpatel.dev/mcpstreamable-http

What it can do

Tool inventory

Tools (8)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢search(query, section, limit)

Full-text (BM25) search across all essays, book chapters, and field notes. Returns ranked matches with a snippet, id, and canonical URL. Pass an id to get_document to read the full text.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "minLength": 1,
      "description": "Search terms"
    },
    "section": {
      "type": "string",
      "enum": [
        "essay",
        "chapter",
        "note",
        "page"
      ],
      "description": "Restrict to one content type"
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 25,
      "description": "Max results (default 10)"
    }
  },
  "required": [
    "query"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_document(id)

Return the full Markdown of one document by id, e.g. "writing/the-handoff" or "book/preface". Get ids from search or list_corpus.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "description": "Document id, e.g. \"book/preface\""
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢list_corpus(type)

List every document with its id, title, type, date, and word count, plus per-type counts. The table of contents for the whole site. Optionally filter by type.

Input Schema

{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "enum": [
        "essay",
        "chapter",
        "note",
        "page"
      ],
      "description": "Filter by content type"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_profile

Return Saagar Patel's profile: name, one-line summary, site, and the about / now / uses pages. Start here to understand who this is and what they work on.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢list_projects(status, limit)

List the curated, public projects with stack, status, last-active date, and test/CI signals, plus anonymized portfolio-wide aggregates. Optionally filter by status.

Input Schema

{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "description": "Filter by status, e.g. \"active\" or \"archived\""
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "description": "Max projects"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢list_repo_profiles(attentionState, limit)

List public-safe repo answering profiles with repo id, attention state, freshness, and proof counts. Profiles are static artifacts baked from saagarpatel.dev, not live repo health.

Input Schema

{
  "type": "object",
  "properties": {
    "attentionState": {
      "type": "string",
      "description": "Filter by attention state, e.g. \"active-infra\" or \"decision-needed\""
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 25,
      "description": "Max profiles"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_repo_profile(repoId)

Return one public-safe repo answering profile by repo_id, including purpose, safe commands, agent surfaces, proof refs, freshness, exclusions, limitations, and integrity metadata.

Input Schema

{
  "type": "object",
  "properties": {
    "repoId": {
      "type": "string",
      "minLength": 1,
      "description": "Repo profile id, e.g. \"githubrepoauditor\""
    }
  },
  "required": [
    "repoId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_operant_results

Return the public, sanitized OPERANT results: per-model operator-calibration-score (OCS) profiles, the headline figures, and the calibration-profiles (not a flat leaderboard) framing. Sourced from the published OPERANT mirror. Returns availability=false if no dataset was baked.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded8 tools
verifiedversion not recorded8 tools