profilekit-mcp
The profilekit-mcp server lets you discover, configure, and generate GitHub profile SVG card URLs and embeddable snippets through any MCP-capable AI agent (e.g. Claude Code, Codex CLI, ChatGPT Apps).
List card types (
list_cards): Retrieve a live-synced catalog of all supported ProfileKit card types (e.g.stats,pin,hero,snake,leetcode,timeline,stack,matrix, and more), along with descriptions and required parameters for each.List themes (
list_themes): Get all built-in themes (e.g.tokyo_night,kanagawa,dracula,rose_pine,nord) that can be applied to any card via?theme=<name>.Render cards (
render): Generate a complete card URL plus ready-to-paste Markdown and HTML embedding snippets for a given card type and parameters — without fetching the SVG itself, keeping responses lightweight and side-effect-free.Supports card-specific parameters (e.g.
username,repo,theme) as key/value pairs.Supports custom color palettes via
?theme_url=pointing to a raw JSON Gist.Supports optional custom alt text for the generated Markdown snippet.
Always up to date: Card definitions are fetched live from ProfileKit's API, so the latest card types and parameters are always available without manual updates.
The rendered cards can be embedded in dev.to articles via markdown or HTML snippets.
Provides tools to build GitHub profile SVG cards, such as stats cards, pin cards, and hero banners, for embedding in GitHub READMEs.
The rendered cards can be embedded in Hashnode blog posts via markdown or HTML snippets.
The rendered cards can be used as Notion cover images.
Click on "Install 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., "@profilekit-mcpRender a tokyo_night stats card for heznpc"
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.
profilekit-mcp
MCP server for ProfileKit. Build GitHub profile SVG cards through conversation — from Claude Code, Codex CLI, ChatGPT Apps, or any other MCP-capable agent.
Currently implemented
3 tools over stdio MCP:
list_cards,list_themes,render.Card types covering data (stats, pin, leetcode, …), blog layout (hero, section, timeline, …), animations (typing, snake, matrix, …), composition (
stack), and utility (health) — exact set returned live bylist_cards.Built-in themes (
tokyo_night,kanagawa,rose_pine,dracula,nord, …) — pass?theme=<name>to any card; exact set returned live bylist_themes.Dynamic catalog sync from
https://profilekit.vercel.app/api/catalog, cached per process; falls back to a bundled snapshot if the fetch fails.Custom palettes via
?theme_url=<gist-raw-url>(supported on/statsand/stackas of ProfileKit v1).Package identity and CLI binary are both
profilekit-mcp; the package exports a typedrunServerentrypoint.
Related MCP server: unbiased
Planned
compose_readme(sections)tool — return a full blog-layout README snippet in one call.Palette suggestion tool backed by the caller's own vision/LLM capability — no built-in model calls.
Design intent
URL-only, never inlines SVG.
renderreturns a URL plus markdown / HTML snippets; the SVG is fetched by the eventual<img>consumer (GitHub, dev.to, Notion, …). Tool responses stay small, side-effect-free, and embeddable anywhere external images are allowed.One MCP server, three agents. After OpenAI and Anthropic co-announced MCP Apps in early 2026, a single stdio server covers Claude Code + Codex CLI + ChatGPT Apps natively — no per-platform adapter.
Live catalog over hardcoded list. Card definitions live in ProfileKit's
/api/catalog, so when ProfileKit ships a new card the MCP server picks it up without a republish. The bundled fallback exists only so cold/offline starts still work.No ranking, composable presentation. Mirrors ProfileKit's stance — every card is an independent SVG that the user composes, not a leaderboard.
Non-goals
Inlining card SVG into tool responses. The MCP server intentionally does not fetch card content. Agents that need to reason over the markup can fetch the URL themselves.
Built-in model calls. Future "suggest a palette" or "describe this card" features delegate to the calling agent's own LLM — this server never makes outbound LLM API calls.
Ranking, leaderboards, or rendering opinions in the tool surface.
Redacted
(none for this repo)
Install
After the unscoped npm package is published:
npm install -g profilekit-mcpBefore npm publication, run from this repository:
npm ci
npm run build
node dist/bin.js helpRegister with your agent
Claude Code — add to .claude/settings.json in your repo:
{
"mcpServers": {
"profilekit": { "command": "profilekit-mcp" }
}
}Codex CLI — add to ~/.codex/config.toml:
[mcp_servers.profilekit]
command = "profilekit-mcp"ChatGPT Apps — (Apps SDK MCP adapter; see the Apps SDK docs for wire-up)
Usage
Inside any registered agent, just ask:
> What ProfileKit cards exist?
> Render a tokyo_night stats card for heznpc.
> Give me a hero banner saying "heznpc" with subtitle "Building the ecosystem AI lives in", wave background, space-grotesk font.
> Build a kanagawa-themed pin card for heznpc/ProfileKit.The agent will invoke list_cards / list_themes / render under the hood and hand you back a URL + markdown snippet ready to paste into your README.
Verify locally
npm ci
npm audit --audit-level=high
npm test
npm run build
npm run smoke:mcp
npm run pack:checknpm run smoke:mcp builds the package, starts dist/bin.js over stdio through the MCP SDK client, lists the three tools, renders a deterministic card URL, and verifies required-param errors.
npm run pack:check runs npm pack --dry-run --json and verifies the exported types, server export, CLI binary, and required package files are present in the tarball.
Tools
Tool | Description |
| Enumerate every card type returned by the live catalog, with descriptions and required params |
| List the built-in themes |
| Build a card URL + markdown + HTML snippet for a given type and params |
Example conversation
You: Render a pin card for heznpc/anvil using the rose_pine theme.
Agent: [calls render(type="pin", params={username: "heznpc", repo: "anvil", theme: "rose_pine"})]
URL:
https://profilekit.vercel.app/api/pin?username=heznpc&repo=anvil&theme=rose_pine
Markdown:

HTML:
<img src="https://profilekit.vercel.app/api/pin?username=heznpc&repo=anvil&theme=rose_pine" alt="pin" />License
MIT © heznpc
Available Tools
3 toolslist_cardsA
List every ProfileKit card type (stats, hero, snake, ...) with a one-line description and the required params for each. Use this before calling render when the user asks what cards exist or which to use. Catalog is fetched live from ProfileKit on first call and cached per process.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must convey behavior. It states the catalog is fetched live from ProfileKit on first call and cached per process, which is useful context. A slight deduction for not mentioning if listing is read-only (though implied).
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?
Three sentences, each earning its place: first explains what it does, second when to use it, third a behavioral note. No wasted words.
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 covers purpose, usage, and behavior completely. No gaps.
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?
The input schema has no parameters, and schema description coverage is 100% (vacuously). The description adds meaning by describing what the output contains (one-line description, required params) beyond the empty 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?
The description states the tool lists every ProfileKit card type with a one-line description and required params. It specifies the exact resource (card types) and action (list), clearly distinguishing it from siblings like 'render'.
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 explicitly says to use this tool before calling 'render' when the user asks what cards exist or which to use. This provides clear context for when to use it versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_themesA
List built-in ProfileKit themes (dark, tokyo_night, kanagawa, rose_pine, ...). Any card accepts ?theme=<name>. For fully custom palettes use ?theme_url= pointing to a JSON gist.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description carries full burden. Discloses it lists only built-in themes, and hints at card integration. No mention of whether it returns names only or full details, but adequate for a simple list 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?
Two sentences, front-loaded with purpose and examples, no fluff. Every word earns its place.
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 parameterless list tool with no output schema, description is sufficient. Explains purpose, examples, and integration with cards. Could mention if output is sorted or filtered, but not critical.
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 has no parameters (coverage 100%), and description adds value by explaining how the output relates to card usage, providing context beyond the empty 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 it lists built-in ProfileKit themes and provides specific examples (dark, tokyo_night, kanagawa, rose_pine). Distinguishes from sibling tools like list_cards and render.
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?
Explains how to use themes with cards via ?theme= parameter, and mentions alternative ?theme_url= for custom palettes. Could be more explicit about when to choose each option.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
renderA
Build a ProfileKit card URL plus ready-to-paste markdown and HTML snippets for the given card type and params. Does NOT fetch the SVG itself — the URL is what consumers embed. Call list_cards first if unsure which type or what params the user's card accepts.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Card type (e.g. 'stats', 'hero', 'snake'). Must be one of the keys returned by list_cards. | |
| params | No | Card-specific parameters as key/value pairs (e.g. {username: 'heznpc', theme: 'tokyo_night'}). See list_cards output for common params per type. Values are stringified and URL-encoded. | |
| alt | No | Optional alt text for the markdown image. Defaults to the card type. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It clearly states the tool does NOT fetch the SVG, which is a key behavioral trait. However, it does not mention side effects, permissions, or rate limits, which would be needed for full transparency. The explicit negation of SVG fetching earns a high score, but some gaps remain.
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 two sentences long, highly concise, and front-loads the core purpose. Every sentence provides essential information without 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?
Given the tool has no output schema and moderate complexity (nested params), the description adequately explains the tool's output (URL and snippets) and workflow (call list_cards first). It could mention the output format in more detail, but the context signals (no output schema) mean the description carries this burden well.
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 description coverage is 100%, so baseline is 3. The description adds minimal extra meaning beyond the schema: it explains that values are stringified and URL-encoded, and suggests using list_cards output for common params. This adds some value but not enough to raise the score above baseline.
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 builds a ProfileKit card URL and markdown/HTML snippets, specifying the verb 'Build' and the resource 'ProfileKit card URL plus snippets'. It distinguishes from 'list_cards' by noting it does NOT fetch the SVG, which helps clarify the tool's scope.
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 explicitly advises to call 'list_cards' first if unsure about the card type or parameters, providing clear when-to-use and when-not-to-use guidance. It also mentions that the URL is for embedding, not fetching SVG, setting correct expectations.
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. Dates show when Glama detected each change.
3 tool updates
v0.2.1- First observed
list_cards - First observed
list_themes - First observed
render
TDQS
Each tool has a distinct purpose: list_cards discovers available card types, list_themes retrieves theme options, and render generates card URLs. There is no overlap between them.
Tools follow a consistent 'verb_noun' pattern with 'list_' for listing and 'render' for generation. 'render' is a bare verb while others have prefix, but it's minor.
With 3 tools covering listing, theming, and rendering, the scope is tight and focused. Each tool is essential and the count is appropriate for a card generation server.
The tools cover the core workflow of discovering cards and themes and generating URLs, but there is no tool for updating or deleting cards (if such operations exist), nor for fetching the rendered SVG directly.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
Connect AI assistants to your GitHub-hosted Obsidian vault to seamlessly access, search, and analy…
Generate images, GIFs, and PDFs from HTML, URLs, or templates — from your AI agent.
Agent personas for Claude. 16 tools, 13 personas, 3 workflows. Zero extra API cost. Free.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to access and analyze GitHub profile data, providing insights on repositories, commit history, coding patterns, and generating portfolio summaries for developers and recruiters.82MIT
- FlicenseNot gradedqualityBmaintenanceReads your GitHub profile and provides developer context (stack, projects, experience) to MCP clients like Claude and Cursor via a single URL.-
- FlicenseNot gradedqualityBmaintenanceEnables AI-powered GitHub automation by connecting Claude AI with GitHub APIs for managing issues and pull requests.-
- FlicenseAqualityDmaintenanceEnables AI agents to query a GitHub user's public profile, repositories, language breakdowns, and README content61-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/starter-series/profilekit-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server