Setting Up Papergraph
lotchuazzz-crypto/papergraph-mcp
A skill your agent uses when a user has cloned PaperGraph MCP and asks to install, initialize, configure, set up, or start using it with an agent or MCP client.
Scaffold a new MCP resource definition. An agent skill from cyanheads/pubmed-mcp-server.
$ npx skills add cyanheads/pubmed-mcp-server --skill add-resource -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install cyanheads/pubmed-mcp-server add-resource --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/cyanheads/pubmed-mcp-server.git skills-src && mkdir -p .claude/skills && cp -r skills-src/framework-skills/add-resource .claude/skills/add-resource && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "add-resource" agent skill from https://github.com/cyanheads/pubmed-mcp-server/tree/main/framework-skills/add-resource into .claude/skills/add-resource/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-resource", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/cyanheads/pubmed-mcp-server/tree/main/framework-skills/add-resourceType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add cyanheads/pubmed-mcp-server --skill add-resource -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install cyanheads/pubmed-mcp-server add-resource --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cyanheads/pubmed-mcp-server.git skills-src && mkdir -p .agents/skills && cp -r skills-src/framework-skills/add-resource .agents/skills/add-resource && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "add-resource" agent skill from https://github.com/cyanheads/pubmed-mcp-server/tree/main/framework-skills/add-resource into .agents/skills/add-resource/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-resource", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add cyanheads/pubmed-mcp-server --skill add-resource -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install cyanheads/pubmed-mcp-server add-resource --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cyanheads/pubmed-mcp-server.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/framework-skills/add-resource .cursor/skills/add-resource && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "add-resource" agent skill from https://github.com/cyanheads/pubmed-mcp-server/tree/main/framework-skills/add-resource into .cursor/skills/add-resource/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-resource", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/cyanheads/pubmed-mcp-server.git --path framework-skills/add-resource--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add cyanheads/pubmed-mcp-server --skill add-resource -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install cyanheads/pubmed-mcp-server add-resource --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cyanheads/pubmed-mcp-server.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/framework-skills/add-resource .gemini/skills/add-resource && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "add-resource" agent skill from https://github.com/cyanheads/pubmed-mcp-server/tree/main/framework-skills/add-resource into .gemini/skills/add-resource/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-resource", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install cyanheads/pubmed-mcp-server add-resourceInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add cyanheads/pubmed-mcp-server --skill add-resource -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/cyanheads/pubmed-mcp-server.git skills-src && mkdir -p .github/skills && cp -r skills-src/framework-skills/add-resource .github/skills/add-resource && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "add-resource" agent skill from https://github.com/cyanheads/pubmed-mcp-server/tree/main/framework-skills/add-resource into .github/skills/add-resource/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-resource", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add cyanheads/pubmed-mcp-server --skill add-resource -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install cyanheads/pubmed-mcp-server add-resource --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cyanheads/pubmed-mcp-server.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/framework-skills/add-resource .opencode/skills/add-resource && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "add-resource" agent skill from https://github.com/cyanheads/pubmed-mcp-server/tree/main/framework-skills/add-resource into .opencode/skills/add-resource/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-resource", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
add-resourceScaffold a new MCP resource definition. An agent skill from cyanheads/pubmed-mcp-server.
Add Resource is an agent skill from cyanheads/pubmed-mcp-server. Scaffold a new MCP resource definition. Use when the user asks to add a resource, expose data via URI, or create a readable endpoint.
Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Agent Workflows, covering MCP servers. It works with Model Context Protocol. The repository describes itself as: Search PubMed/Europe PMC, fetch articles and full text (PMC/EPMC/Unpaywall), citations, MeSH terms via MCP. STDIO or Streamable HTTP. The licence is Apache-2.0.
6 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 5a417fb. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
bunFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Add Resource loads about 3k tokens when it runs. Until then it costs about 37 tokens; SKILL.md has 940 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from cyanheads/pubmed-mcp-server at commit 5a417fb, republished under its Apache-2.0 licence (© cyanheads). 940 words, ~2,979 tokens.
.claude/skills/add-resource/SKILL.md (or your agent's skills folder).Resources use the resource() builder from @cyanheads/mcp-ts-core. Each resource lives in src/mcp-server/resources/definitions/ with a .resource.ts suffix. The standard registration pattern uses a definitions/index.ts barrel that collects all resources into an allResourceDefinitions array for createApp(). Fresh scaffolds start with direct imports in src/index.ts — the barrel is introduced as definitions grow. Match the pattern already used by the project you're editing.
Tool coverage. Not all MCP clients expose resources — many are tool-only (Claude Code, Cursor, most chat UIs). Before adding a resource, verify the same data is reachable via the tool surface — either through a dedicated tool, included in another tool's output, or bundled into a broader tool. A resource whose data has no tool path is invisible to a large share of agents.
{paramName} for path parameters (e.g., myscheme://{itemId}/data)src/mcp-server/resources/definitions/{{resource-name}}.resource.tscreateApp() resource list (directly in src/index.ts for fresh scaffolds, or via a barrel if the repo already has one)bun run devcheck to verifybun run rebuild && bun run start:stdio < /dev/null (or start:http) — the Core services constructed log record must list the new resource in its resources field (the message text shows only counts); if it doesn't, the resource never reached createApp()/**
* @fileoverview {{RESOURCE_DESCRIPTION}}
* @module mcp-server/resources/definitions/{{RESOURCE_NAME}}
*/
import { resource, z } from '@cyanheads/mcp-ts-core';
export const {{RESOURCE_EXPORT}} = resource('{{scheme}}://{{{paramName}}}/data', {
description: '{{RESOURCE_DESCRIPTION}}',
mimeType: 'application/json',
// size: 1024, // optional: content size in bytes, if known
params: z.object({
{{paramName}}: z.string().describe('{{PARAM_DESCRIPTION}}'),
}),
// auth: ['resource:{{resource_name}}:read'],
async handler(params, ctx) {
ctx.log.debug('Fetching resource', { {{paramName}}: params.{{paramName}} });
// Pure logic — throw on failure, no try/catch
return { /* resource data */ };
},
list: async (extra) => ({
resources: [
{
uri: '{{scheme}}://all',
name: '{{RESOURCE_LIST_NAME}}',
mimeType: 'application/json',
},
],
}),
});For resources that return large result sets, use opaque cursor pagination in the handler. resources/read carries no cursor of its own, so the cursor must be a URI template variable — it arrives as a validated URI param. Make it a path segment: a {?cursor} query expansion is mandatory in the SDK's template matcher, so the bare URI (no ?cursor=) stops matching. Serve the first page from an unpaged sibling resource that returns nextCursor, or disclose truncation in the body and point callers at a tool that pages. paginateArray requires a RequestContext for logging — create one from requestContextService:
import { extractCursor, paginateArray, requestContextService } from '@cyanheads/mcp-ts-core/utils';
// URI template: '{{scheme}}://{{{paramName}}}/items/{cursor}'
params: z.object({
{{paramName}}: z.string().describe('{{PARAM_DESCRIPTION}}'),
cursor: z.string().optional().describe('Opaque pagination cursor'),
}),
async handler(params, ctx) {
const allItems = await fetchAllItems(params.{{paramName}});
const cursor = extractCursor({ cursor: params.cursor });
const reqCtx = requestContextService.createRequestContext({
operation: 'list-{{paramName}}',
parentContext: { requestId: ctx.requestId, traceId: ctx.traceId },
});
const page = paginateArray(allItems, cursor, 20, 100, reqCtx);
return {
items: page.items,
nextCursor: page.nextCursor,
};
},// src/index.ts (fresh scaffold default)
import { createApp } from '@cyanheads/mcp-ts-core';
import { {{RESOURCE_EXPORT}} } from './mcp-server/resources/definitions/{{resource-name}}.resource.js';
await createApp({
tools: [/* existing tools */],
resources: [{{RESOURCE_EXPORT}}],
prompts: [/* existing prompts */],
});If the repo already uses src/mcp-server/resources/definitions/index.ts, add the resource to that barrel the way it holds the existing ones — it must end up in the array passed to createApp(). A bare export … from line registers nothing on its own. The standard barrel shape:
import { {{RESOURCE_EXPORT}} } from './{{resource-name}}.resource.js';
export const allResourceDefinitions = [/* existing resources */, {{RESOURCE_EXPORT}}];errors[] contractResources can opt into the same typed error contract as tools — bound to a typed ctx.fail(reason, …) keyed by the declared reason union:
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
export const articleResource = resource('article://{pmid}', {
description: 'Read an article by PMID.',
errors: [
{ reason: 'no_pmid_match', code: JsonRpcErrorCode.NotFound,
when: 'PMID not found in the index.',
recovery: 'Use pubmed_search_articles to discover valid PMIDs first.' },
{ reason: 'withdrawn', code: JsonRpcErrorCode.NotFound,
when: 'Article was withdrawn upstream.',
recovery: 'Check PubMed directly for retraction or withdrawal notices.' },
{ reason: 'upstream_throttled', code: JsonRpcErrorCode.RateLimited,
when: 'Upstream PubMed quota hit.', retryable: true,
recovery: 'Wait a few seconds and retry the request.' },
],
params: z.object({ pmid: z.string().describe('PubMed ID') }),
async handler(params, ctx) {
const article = await fetchOne(params.pmid);
if (!article) throw ctx.fail('no_pmid_match', `PMID ${params.pmid} not indexed`);
if (article.withdrawn) throw ctx.fail('withdrawn');
return article;
},
});Without errors[], the handler receives plain Context (no fail method) and throws via error factories (notFound, serviceUnavailable, …) directly. The contract is opt-in. See framework-skills/api-errors/SKILL.md for the full pattern, baseline codes, and conformance rules.
Add a complete map to enable autocompletion for URI template variables. The SDK auto-installs completion/complete handling and advertises the completions capability when a registered resource template has completion callbacks — no other changes needed.
import { resource, z } from '@cyanheads/mcp-ts-core';
const ITEM_IDS = ['item-001', 'item-002', 'item-abc'];
export const itemResource = resource('items://{itemId}', {
description: 'Retrieve an item by ID.',
params: z.object({ itemId: z.string().describe('Item identifier') }),
handler: (params) => ({ id: params.itemId }),
list: () => ({ resources: ITEM_IDS.map((id) => ({ uri: `items://${id}`, name: id })) }),
// Per-variable completion callbacks — keys must match URI template variable names.
complete: {
itemId: async (partial) => ITEM_IDS.filter((id) => id.startsWith(partial)),
},
});Only applies to templated resources (URI templates with {variable} syntax). Static URIs don't support completion.
resource() optionsBeyond description, params, handler, and list, the builder also supports:
| Field | Purpose |
|---|---|
name | Short human-readable name for resources/list. Defaults to a slug derived from the URI template if omitted. |
output | Optional Zod schema for runtime validation of the handler return value (parity with tool()'s output). |
format | Optional formatter mapping the handler's return to the ReadResourceResult.contents[] shape. Default: string passthrough; objects serialized to JSON. Override when you need to attach permissions, custom encodings, or split into multiple content items. |
annotations | Resource annotations (e.g., audience, priority) — see ResourceAnnotations. |
title | Human-readable display title (defaults to name). |
examples | Array of { name, uri } example entries surfaced in resources/list for discoverability. |
complete | Per-variable completion callbacks for URI template variables. Keys match template variable names. Enables completion/complete and the completions capability. |
cacheHint | { ttlMs?, cacheScope? } — how long a client may cache this resource's resources/read result on protocol revision 2026-07-28. See below. |
A resource that serves slow-changing data can declare how long its resources/read result stays fresh. ttlMs is the lifetime in milliseconds (a non-negative safe integer); cacheScope is 'private' (only the requesting client may cache it) or 'public' (shared caches may too).
export const referenceTable = resource('reference://units', {
description: 'Unit conversion reference table.',
cacheHint: { ttlMs: 86_400_000, cacheScope: 'public' },
handler: () => UNIT_TABLE,
});Resolution is per field, most specific first: the resource's own cacheHint, then the resources/read entry of createApp({ cacheHints }), then the SDK defaults (ttlMs: 0, cacheScope: 'private'). So a resource that names only a scope still inherits the server-wide lifetime.
Set a server-wide policy for the list operations alongside it — those results the SDK builds itself, so a resource cannot speak for them:
await createApp({
cacheHints: {
'tools/list': { ttlMs: 3_600_000, cacheScope: 'public' },
'resources/read': { ttlMs: 60_000 },
},
resources: [referenceTable],
});Cacheable operations are tools/list, prompts/list, resources/list, resources/templates/list, resources/read, and server/discover. Responses to 2025-era clients are unaffected — the hint only fills fields the 2026-07-28 revision defines.
src/mcp-server/resources/definitions/{{resource-name}}.resource.tsresource() uses a valid URI template with {paramName} syntaxparams fields have .describe() annotationsoutput schema added if the handler returns structured data that benefits from runtime validation@fileoverview and @module header presenthandler(params, ctx) is pure — throws on failure, no try/catcherrors[] contract declared: every entry has a recovery field (≥5 words, lint-enforced)src/mcp-server/tools/definitions/ for a tool that exposes this data, or document why this resource is resources-onlylist() function provided if the resource is discoverablecacheHint set if the data is slow-changing and worth caching (ttlMs a non-negative safe integer)extractCursor/paginateArray) — applies to both handler data and list() catalogs with many entriescreateApp() resource list (directly or via barrel)bun run devcheck passesbun run rebuild && bun run start:stdio < /dev/null (or start:http); the Core services constructed record lists the new resource in its resources field© cyanheads, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in framework-skills/add-resource of cyanheads/pubmed-mcp-server.
Open the folder on GitHubat commit 5a417fb
Add Resource next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Add Resource this skillcyanheads/pubmed-mcp-server | 156 | — | ~3k | Automated safety check: Pass | Apache-2.0 | |
| Setting Up Papergraphlotchuazzz-crypto/papergraph-mcp | 285 | — | ~3.3k | Automated safety check: Pass | MIT | |
| Just PRs MCPClawBio/ClawBio | 1.2k | — | ~3.5k | Automated safety check: Pass | MIT | |
| Patsnap Current Awarenesspatsnap/mcp | 113 | — | ~671 | Automated safety check: Pass | Apache-2.0 | |
| Patsnap Scientific Translational Evidencepatsnap/mcp | 113 | — | ~728 | Automated safety check: Pass | Apache-2.0 | |
| Peer Review Loophashgraph-online/awesome-codex-plugins | 1.3k | — | ~2.3k | Automated safety check: Pass | Apache-2.0 |
lotchuazzz-crypto/papergraph-mcp
A skill your agent uses when a user has cloned PaperGraph MCP and asks to install, initialize, configure, set up, or start using it with an agent or MCP client.
ClawBio/ClawBio
Compute evidence-aware polygenic risk scores from a local VCF or WGS file through the validated just-prs engine and a pinned local just-prs MCP server.
patsnap/mcp
Patsnap Current Awareness MCP for AI agents. An agent skill from patsnap/mcp.
patsnap/mcp
Patsnap Scientific & Translational Evidence MCP for AI agents.
hashgraph-online/awesome-codex-plugins
Peer Review Ralph Loop — combines Cavekit kits with a Ralph Loop and true cross-model peer review using Codex (OpenAI).
anthropics/skills
Guides the design and implementation of Model Context Protocol servers in TypeScript or Python, from tool naming and error messages to evaluation.
cyanheads/pubmed-mcp-server
Scaffold an MCP App tool + UI resource pair. An agent skill from cyanheads/pubmed-mcp-server.
cyanheads/pubmed-mcp-server
Scaffold a new MCP prompt template. An agent skill from cyanheads/pubmed-mcp-server.
cyanheads/pubmed-mcp-server
Scaffold a new service integration. An agent skill from cyanheads/pubmed-mcp-server.
cyanheads/pubmed-mcp-server
Scaffold a test file for an existing tool, resource, or service.
cyanheads/pubmed-mcp-server
Authentication, authorization, and multi-tenancy patterns for @cyanheads/mcp-ts-core.
cyanheads/pubmed-mcp-server
Stand up a persistent, self-refreshing local mirror of a bulk upstream dataset with the MirrorService (@cyanheads/mcp-ts-core/mirror).
Works with
Categories
Scaffold a new MCP resource definition. An agent skill from cyanheads/pubmed-mcp-server. Add Resource is an agent skill from cyanheads/pubmed-mcp-server. Scaffold a new MCP resource definition.
Add Resource fits situations like: the user asks to add a resource; expose data via URI; create a readable endpoint.
Run `npx skills add cyanheads/pubmed-mcp-server --skill add-resource -a claude-code`. Or copy the skill folder (framework-skills/add-resource in cyanheads/pubmed-mcp-server) into .claude/skills/add-resource in your project. Claude Code loads it when a task matches its description.
Run `npx skills add cyanheads/pubmed-mcp-server --skill add-resource -a codex`. Or copy the skill folder (framework-skills/add-resource in cyanheads/pubmed-mcp-server) into .agents/skills/add-resource in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add cyanheads/pubmed-mcp-server --skill add-resource -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/add-resource, .gemini/skills/add-resource, .github/skills/add-resource and .opencode/skills/add-resource in your project.
Going by SKILL.md and its folder, Add Resource needs the command-line tools its instructions call (bun).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Add Resource is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Add Resource: Setting Up Papergraph (lotchuazzz-crypto/papergraph-mcp, 285 stars), Just PRs MCP (ClawBio/ClawBio, 1.2k stars), Patsnap Current Awareness (patsnap/mcp, 113 stars) and Patsnap Scientific Translational Evidence (patsnap/mcp, 113 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
cyanheads (a GitHub user) maintains it in cyanheads/pubmed-mcp-server, which has 156 GitHub stars. The repository holds 30 skills in this directory. The repository was last updated on October 4, 2026.
Source: cyanheads/pubmed-mcp-server on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.