MCP Server Builder
anthropics/skills
Guides the design and implementation of Model Context Protocol servers in TypeScript or Python, from tool naming and error messages to evaluation.
Packages standalone FHIR R4 resources from OpenMed output into one transaction Bundle with stable fullUrls and rewritten references, ready to post to a FHIR server.
$ npx skills add maziyarpanahi/openmed --skill assembling-fhir-bundles -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install maziyarpanahi/openmed assembling-fhir-bundles --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/maziyarpanahi/openmed.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/assembling-fhir-bundles .claude/skills/assembling-fhir-bundles && 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 "assembling-fhir-bundles" agent skill from https://github.com/maziyarpanahi/openmed/tree/master/skills/assembling-fhir-bundles into .claude/skills/assembling-fhir-bundles/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "assembling-fhir-bundles", 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/maziyarpanahi/openmed/tree/master/skills/assembling-fhir-bundlesType 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 maziyarpanahi/openmed --skill assembling-fhir-bundles -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install maziyarpanahi/openmed assembling-fhir-bundles --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/maziyarpanahi/openmed.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/assembling-fhir-bundles .agents/skills/assembling-fhir-bundles && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "assembling-fhir-bundles" agent skill from https://github.com/maziyarpanahi/openmed/tree/master/skills/assembling-fhir-bundles into .agents/skills/assembling-fhir-bundles/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "assembling-fhir-bundles", 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 maziyarpanahi/openmed --skill assembling-fhir-bundles -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install maziyarpanahi/openmed assembling-fhir-bundles --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/maziyarpanahi/openmed.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/assembling-fhir-bundles .cursor/skills/assembling-fhir-bundles && 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 "assembling-fhir-bundles" agent skill from https://github.com/maziyarpanahi/openmed/tree/master/skills/assembling-fhir-bundles into .cursor/skills/assembling-fhir-bundles/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "assembling-fhir-bundles", 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/maziyarpanahi/openmed.git --path skills/assembling-fhir-bundles--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 maziyarpanahi/openmed --skill assembling-fhir-bundles -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install maziyarpanahi/openmed assembling-fhir-bundles --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/maziyarpanahi/openmed.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/assembling-fhir-bundles .gemini/skills/assembling-fhir-bundles && 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 "assembling-fhir-bundles" agent skill from https://github.com/maziyarpanahi/openmed/tree/master/skills/assembling-fhir-bundles into .gemini/skills/assembling-fhir-bundles/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "assembling-fhir-bundles", 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 maziyarpanahi/openmed assembling-fhir-bundlesInstalls 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 maziyarpanahi/openmed --skill assembling-fhir-bundles -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/maziyarpanahi/openmed.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/assembling-fhir-bundles .github/skills/assembling-fhir-bundles && 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 "assembling-fhir-bundles" agent skill from https://github.com/maziyarpanahi/openmed/tree/master/skills/assembling-fhir-bundles into .github/skills/assembling-fhir-bundles/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "assembling-fhir-bundles", 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 maziyarpanahi/openmed --skill assembling-fhir-bundles -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install maziyarpanahi/openmed assembling-fhir-bundles --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/maziyarpanahi/openmed.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/assembling-fhir-bundles .opencode/skills/assembling-fhir-bundles && 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 "assembling-fhir-bundles" agent skill from https://github.com/maziyarpanahi/openmed/tree/master/skills/assembling-fhir-bundles into .opencode/skills/assembling-fhir-bundles/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "assembling-fhir-bundles", 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.
assembling-fhir-bundlesPackages standalone FHIR R4 resources from OpenMed output into one transaction Bundle with stable fullUrls and rewritten references, ready to post to a FHIR server.
A FHIR server takes a single transaction Bundle whose resources reference each other, and the skill uses OpenMed's mechanical assembler, to_bundle in openmed.clinical.exporters.fhir, to build it from the resources made in the earlier exporting-to-fhir step. It does exactly three things: give each resource a urn:uuid fullUrl seeded by document ID and index so the same input always yields identical output, repoint references to resources present in the Bundle, and add request blocks for transaction or batch types.
References whose targets are absent from the Bundle, such as a Patient removed by de-identification, are left alone. The function raises ValueError for a resource without resourceType or for two resources sharing the same type and ID, and it never invents or validates content, so checking against US Core is handed to a separate validating skill. The description also mentions conditional create.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 34d7b8c. 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.
No scripts in the folder and no shell commands in SKILL.md (its code samples are python and json).
From the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
terminology.hl7.orgAlso links to:
hl7.orgFrom 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.
FHIR Bundle Assembler loads about 2.2k tokens when it runs. Until then it costs about 162 tokens; SKILL.md has 690 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 maziyarpanahi/openmed at commit 34d7b8c, republished under its Apache-2.0 licence (© maziyarpanahi). 690 words, ~2,194 tokens.
.claude/skills/assembling-fhir-bundles/SKILL.md (or your agent's skills folder).A FHIR server ingests one transaction Bundle, not loose resources, and the
resources inside it must cross-reference each other (Condition.subject →
Patient, Observation.encounter → Encounter, DiagnosticReport.result →
Observation). OpenMed ships a deterministic, mechanical Bundle assembler —
openmed.clinical.exporters.fhir.to_bundle — that wraps the resources you built
in exporting-to-fhir into a valid R4 Bundle and wires up the references.
Use after you have a list of standalone resources from exporting-to-fhir and
the destination is a FHIR server. Reach for it when the user says "build a
Bundle", "transaction", "POST these resources", or needs internal references
resolved. To check the Bundle against US Core, hand off to validating-us-core.
from openmed.clinical.exporters.fhir import to_bundle, deterministic_fullurl
bundle = to_bundle(
resources, # Sequence[Mapping] each with a resourceType
doc_id="note-2024-03-02-001", # seeds stable urn:uuid fullUrls
bundle_type="transaction", # "transaction" | "batch" | "collection" | ...
)to_bundle does exactly three things, and never synthesises or validates:
fullUrl. Each resource gets a urn:uuid seeded by
doc_id + its index, so the same input always produces byte-identical
output (golden-test friendly). You can pre-compute the same urn with
deterministic_fullurl(doc_id, index).{"reference": "ResourceType/id"} whose target
is present in the Bundle is repointed at that resource's fullUrl. References
to resources absent from the Bundle (e.g. a Patient removed by
de-identification) are left untouched — no dangling internal refs.transaction/batch bundles each entry gets a
request block ({"method": "POST", "url": "<ResourceType>"}) so the server
knows to create it.It raises ValueError if a resource lacks resourceType, or if two
resources share the same ResourceType/id (duplicate ids would silently corrupt
the reference map).
from openmed.clinical.exporters.fhir import to_bundle
from openmed.clinical.exporters.codeable_concept_simple import coding, codeable_concept
condition = {
"resourceType": "Condition", "id": "cond-1",
"clinicalStatus": {"coding": [{
"system": "http://terminology.hl7.org/CodeSystem/condition-clinical",
"code": "active"}]},
"code": codeable_concept(
[coding("snomed", "44054006", "Diabetes mellitus type 2")],
text="type 2 diabetes"),
"subject": {"reference": "Patient/patient-1"}, # internal ref, rewritten
}
medication = {
"resourceType": "MedicationStatement", "id": "med-1", "status": "active",
"medicationCodeableConcept": codeable_concept(
[coding("rxnorm", "860975", "metformin 500 MG Oral Tablet")],
text="metformin 500 mg"),
"subject": {"reference": "Patient/patient-1"},
}
patient = {
"resourceType": "Patient", "id": "patient-1",
"gender": "unknown", # de-identified, synthetic
}
bundle = to_bundle([patient, condition, medication],
doc_id="demo-note", bundle_type="transaction"){
"resourceType": "Bundle",
"type": "transaction",
"entry": [
{
"fullUrl": "urn:uuid:6f1c...e2",
"resource": { "resourceType": "Patient", "id": "patient-1", "gender": "unknown" },
"request": { "method": "POST", "url": "Patient" }
},
{
"fullUrl": "urn:uuid:9a3b...77",
"resource": {
"resourceType": "Condition", "id": "cond-1",
"subject": { "reference": "urn:uuid:6f1c...e2" }
},
"request": { "method": "POST", "url": "Condition" }
},
{
"fullUrl": "urn:uuid:c0d4...19",
"resource": {
"resourceType": "MedicationStatement", "id": "med-1",
"subject": { "reference": "urn:uuid:6f1c...e2" }
},
"request": { "method": "POST", "url": "MedicationStatement" }
}
]
}Note Condition.subject and MedicationStatement.subject were rewritten from
"Patient/patient-1" to the Patient entry's fullUrl — that is what makes the
transaction resolvable in a single POST.
exporting-to-fhir; give each a unique id."Patient/<id>"; resolve those with conditional create (below).to_bundle(resources, doc_id=<stable>, bundle_type="transaction").POST [base] {Bundle}.validating-us-core).to_bundle writes POST <ResourceType> request blocks. To make a transaction
idempotent, post-process the entry's request to add an ifNoneExist query
so the server reuses an existing match instead of creating a duplicate:
for entry in bundle["entry"]:
if entry["resource"]["resourceType"] == "Patient":
entry["request"]["ifNoneExist"] = "identifier=http://hospital.example|MRN-REDACTED"The server creates the Patient only if no match exists; otherwise it links the
references to the existing one. PUT with a known id is the alternative for
true upserts.
exporting-to-fhir, which in
turn comes from openmed.analyze_text. Keep doc_id stable per source
document so re-running the pipeline yields the same Bundle.openmed.interop.fhir_operations.de_identify_bundle(bundle)
walks every entry's free text + XHTML narrative and de-identifies it while
preserving Bundle type, entry order, fullUrls, request blocks, and
references — codes, systems, and temporal values are never altered. Use it as
a final safety pass before transmission if any narrative might carry PHI.OperationOutcome on error).
Surface those to the user; for your own pre-flight findings use
to_operation_outcome(...) from the same package.id are valid but unreferenceable — nothing can
point at them and they will not be reference-rewrite targets.ResourceType/id raises. This is intentional: a duplicate id
would silently overwrite an entry in the reference map and corrupt
cross-references. Make ids unique."Patient/existing-123" you mean to resolve on
the server stays literal — pair it with ifNoneExist or a PUT.transaction vs batch. transaction is atomic (all-or-nothing, server
resolves urn:uuid references); batch is independent per-entry and does not
guarantee reference resolution. Use transaction when entries reference each
other.collection/document bundles get no request blocks (only
transaction/batch do) — correct, since they are not meant to be POSTed for
creation.validating-us-core before
submission.fullUrl resolution: https://hl7.org/fhir/R4/bundle.html#referencesifNoneExist): https://hl7.org/fhir/R4/http.html#cond-update© maziyarpanahi, 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 skills/assembling-fhir-bundles of maziyarpanahi/openmed.
Open the folder on GitHubat commit 34d7b8c
FHIR Bundle Assembler 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 |
|---|---|---|---|---|---|---|
| FHIR Bundle Assembler this skillmaziyarpanahi/openmed | 5.5k | — | ~2.2k | Automated safety check: Pass | Apache-2.0 | |
| MCP Server Builderanthropics/skills | 180k | 63 repos | ~2.3k | Automated safety check: Pass | Apache-2.0 | |
| MCP Server BuildershareAI-lab/learn-claude-code | 78k | 4 repos | ~1.2k | Automated safety check: Pass | MIT | |
| Firecrawl Page Scrape Integrationfirecrawl/firecrawl | 190k | 1 repos | ~944 | Automated safety check: Pass | ISC | |
| Firecrawl Interact Integrationfirecrawl/firecrawl | 190k | 1 repos | ~731 | Automated safety check: Pass | ISC | |
| CCXT Crypto Exchange Library2025Emma/vibe-coding-cn | 23k | 1 repos | ~4.4k | Automated safety check: Pass | MIT |
anthropics/skills
Guides the design and implementation of Model Context Protocol servers in TypeScript or Python, from tool naming and error messages to evaluation.
shareAI-lab/learn-claude-code
Walks through building MCP servers in Python or TypeScript that expose tools, resources and prompts to Claude, with templates, registration and testing.
firecrawl/firecrawl
Adds Firecrawl's /scrape endpoint to application code to pull markdown, HTML, links, screenshots or structured data from a single known URL.
firecrawl/firecrawl
Guides adding Firecrawl's /interact endpoint to product code for pages that need clicks, forms, pagination or logged-in flows beyond plain scraping.
2025Emma/vibe-coding-cn
Reference help for the CCXT library covering crypto exchange APIs, market data, trading and order management across 150+ exchanges in JavaScript, Python and PHP.
andrewyng/context-hub
Guides building Tavily integrations for web search, URL extraction, site crawling and AI-assisted research in Python or JavaScript agent and RAG projects.
maziyarpanahi/openmed
Checks OpenMed de-identified clinical text against the 18 HIPAA Safe Harbor identifier categories and reports gaps and residual re-identification risk.
maziyarpanahi/openmed
Fills in a model card for an OpenMed clinical NER or de-identification model from its evaluation reports: intended use, metrics, subgroups and limitations.
maziyarpanahi/openmed
Walks a data pipeline against the HIPAA Privacy and Security Rule checklist and produces a gap report before it processes patient data.
maziyarpanahi/openmed
Suggests candidate ICD-10-CM diagnosis and ICD-10-PCS procedure codes for clinical text extracted by OpenMed, with rationale for a certified coder to review.
maziyarpanahi/openmed
Maps OpenMed-extracted, terminology-coded conditions, drugs and measurements into OMOP CDM v5.4 tables for OHDSI and ATLAS analytics.
maziyarpanahi/openmed
Finds social risks such as housing instability or food insecurity in clinical notes and proposes matching ICD-10-CM Z-codes for a coder to confirm.
Works with
Categories
Packages standalone FHIR R4 resources from OpenMed output into one transaction Bundle with stable fullUrls and rewritten references, ready to post to a FHIR server. fhir, to build it from the resources made in the earlier exporting-to-fhir step. It does exactly three things: give each resource a urn:uuid fullUrl seeded by document ID and index so the same input always yields identical output, repoint references to resources present in the Bundle, and add request blocks for transaction or batch types.
FHIR Bundle Assembler fits situations like: combining several Condition, Observation and MedicationStatement resources into one Bundle; preparing resources to POST to an EHR or FHIR server; making Bundle output byte-identical for golden tests.
Run `npx skills add maziyarpanahi/openmed --skill assembling-fhir-bundles -a claude-code`. Or copy the skill folder (skills/assembling-fhir-bundles in maziyarpanahi/openmed) into .claude/skills/assembling-fhir-bundles in your project. Claude Code loads it when a task matches its description.
Run `npx skills add maziyarpanahi/openmed --skill assembling-fhir-bundles -a codex`. Or copy the skill folder (skills/assembling-fhir-bundles in maziyarpanahi/openmed) into .agents/skills/assembling-fhir-bundles 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 maziyarpanahi/openmed --skill assembling-fhir-bundles -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/assembling-fhir-bundles, .gemini/skills/assembling-fhir-bundles, .github/skills/assembling-fhir-bundles and .opencode/skills/assembling-fhir-bundles in your project.
SKILL.md names no scripts, command-line tools or credentials: FHIR Bundle Assembler is instructions for the agent only. Our summary lists: Python with the OpenMed package; FHIR R4 resources already exported by the exporting-to-fhir skill.
SKILL.md names 2 domains. In commands or code: terminology.hl7.org; the agent is likely to contact it when it follows the instructions. As links in the text: hl7.org. 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.
FHIR Bundle Assembler is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.2k tokens (SKILL.md is roughly 8.8k 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 FHIR Bundle Assembler: MCP Server Builder (anthropics/skills, 180k stars), MCP Server Builder (shareAI-lab/learn-claude-code, 78k stars), Firecrawl Page Scrape Integration (firecrawl/firecrawl, 190k stars) and Firecrawl Interact Integration (firecrawl/firecrawl, 190k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
maziyarpanahi (a GitHub user) maintains it in maziyarpanahi/openmed, which has 5,506 GitHub stars. The repository holds 74 skills in this directory. The repository was last updated on October 11, 2026.
Source: maziyarpanahi/openmed on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.