File a bug or feature request against @cyanheads/mcp-ts-core when you hit a framework issue. Use when a builder, utility, context method, or config behaves contrary to the documented API — not for server-specific application bugs.
You've isolated a problem to @cyanheads/mcp-ts-core itself — not your server code, not a misconfiguration, not a missing peer dependency. Typical triggers:
createApp() or createWorkerHandler() fails on a valid config
Context properties (ctx.log, ctx.state, ctx.inputs, etc.) behave contrary to docs
A utility from /utils, /errors, /auth, /storage, /services returns wrong results or throws unexpectedly
Type exports are incorrect or missing (compile error on documented usage)
The definition linter (bun run lint:mcp) produces false positives or misses real violations
For general gh CLI workflows outside issue filing (PRs, workflows, API access), see the github-cli skill.
Before Filing
Confirm framework version — bun pm ls @cyanheads/mcp-ts-core or check node_modules/@cyanheads/mcp-ts-core/package.json
Check you're on latest — bun outdated @cyanheads/mcp-ts-core. If behind, update and retest before filing.
Isolate the issue — reproduce with a minimal handler or standalone script. Strip server-specific services, config, and dependencies. If the bug disappears when isolated, it's likely in your server code.
Search existing issues — don't file duplicates:
gh issue list -R cyanheads/mcp-ts-core --search "your error message or keyword" --state all
# Assess a close match before commenting — is it already linked to a fix or referenced elsewhere?
gh issue view <number> -R cyanheads/mcp-ts-core --comments
gh api 'repos/cyanheads/mcp-ts-core/issues/<number>/timeline' --paginate \
--jq '.[] | select(.event=="cross-referenced") | .source.issue | "\(.repository.full_name)#\(.number) — \(.title)"'
For documentation- or contract-shaped requests, audit all three doc layers first — proposals to add reference docs, public-API conventions, attribute/event catalogs, or stability commitments often duplicate surface that already exists. Check src/ for behavior, docs/ for human-facing reference, and framework-skills/ for agent-facing reference. Skill files marked audience: external are the framework's public contract — treat them as authoritative when evaluating whether a documentation gap exists. Also verify the constants or types you'd reference aren't already exported from @cyanheads/mcp-ts-core or one of its subpaths.
Writing Well-Structured Issues
Good issues are scannable, concrete, and self-contained — terse and fact-dense. Default to one or two sentences per bullet; if a bullet runs long, split it or cut it. These patterns apply to both bugs and features — the guidance targets any prose block (Description, Additional context, feature proposals).
Lead with specifics. Name the tool, function, module, or symptom. "Currently createApp() throws ConfigurationError when MCP_HTTP_PORT is set to 0" beats "There's a problem with the config." A reader should know what's broken or missing before the end of the first sentence.
Embed library/service links on first mention.[Hono](https://hono.dev/), [linkedom](https://github.com/WebReflection/linkedom). Link to the canonical repo or homepage so readers can verify the dependency and reach docs in one click.
Use owner/repo#N for cross-repo issue references. GitHub auto-renders them as linked references (e.g. cyanheads/pubmed-mcp-server#34). Bare #N only works for same-repo issues.
Add a Related: #N line near the top when the issue grows from prior context (discussions, other issues, PRs). Makes provenance clickable.
Cite cross-references once per body. Link an issue/PR in Related:, the description, or Additional context — not all three. The reader sees them all; redundant linking dilutes signal.
Lead design sections with a philosophy sentence. Bold a short principle before the tradeoff details — e.g. "Philosophy: fail fast on config errors, degrade gracefully on runtime errors." Establishes the lens for the rest of the section.
Prefer Markdown tables for comparisons. When showing options, tiers, strategies, or tradeoffs — tables are the highest-density format for scanning N rows × M attributes.
Separate ### Scope from ### Out of scope. The latter is as important as the former — it pre-empts scope-creep debates in comments and signals you've thought about the boundaries.
Use Depends on: owner/repo#N to declare ordering explicitly when implementation is blocked on another issue landing first.
Cut what dilutes the signal. Mechanism walkthroughs (link the PR or doc instead), ceremonial framings ("This issue covers…"), conversation references ("as discussed", "per offline"), and kitchen-sink Additional context blocks. If a paragraph isn't pulling weight, drop it.
Skip collaborator-framing sign-offs. Lines like "Happy to open a PR", "let me know if you'd like", "willing to contribute", "if that's the preferred flow" read as noise. A PR link beats an offer; if you're the maintainer filing against your own repo, the offer is redundant. End the body at the last substantive point.
Redact Before Posting
GitHub issues are public. Do not include secrets, credentials, API keys, or tokens. Redact sensitive values from env vars, headers, and logs before submitting. Replace with obvious placeholders: REDACTED, sk-...REDACTED. Do not rely on partial masking — partial keys can still be exploited.
Filing a Bug
The repo has YAML form issue templates. Use --web to open the form in the browser (preferred when available), or pass --title + --body for non-interactive use.
For long output, write to a file and attach. Note: --body-file replaces the entire body — it does not supplement a --body flag. For structured bugs with logs, either embed the log content in the Additional context section of a normal --body, or file the issue first and add the log as a comment:
bun run rebuild && bun run start:stdio 2>&1 | head -100 > /tmp/mcp-error.log
# As part of a new issue (the log becomes the entire body — no template fields)
gh issue create -R cyanheads/mcp-ts-core \
--title "bug(transport): stdio crashes on large payload" \
--label "bug" \
--assignee "@me" \
--body-file /tmp/mcp-error.log
# Or as a comment on an existing issue
gh issue comment <number> -R cyanheads/mcp-ts-core --body-file /tmp/mcp-error.log
The first three headings are the Feature Request form's own fields, in its order — Use case and Proposed API are required by the form, so a body without them does not satisfy it. Everything after Alternatives considered is supplemental; omit what you don't need — simple requests don't require Flow / Design / Dependencies blocks.
gh issue create -R cyanheads/mcp-ts-core \
--title "feat(scope): concise description" \
--label "enhancement" \
--assignee "@me" \
--body "$(cat <<'ISSUE'
### Use case
One or two sentences: who hits this gap in the framework and why it matters. Name the specific builder, utility, context method, or config field. Kept short on purpose — a field that invites a paragraph gets padded with background and skipped by the next reader.
Related: #N
### Proposed API
What you want the framework to do, then the API as a consumer would call it. Link external libraries on first mention: [lib name](https://github.com/owner/repo).
```ts
import { withRetry } from '@cyanheads/mcp-ts-core/utils';
const result = await withRetry(() => fetchExternal(url), {
maxAttempts: 3,
backoff: 'exponential',
});
```
### Alternatives considered
What you tried or evaluated instead, and why it didn't fit.
### Scope
- Files or modules touched
- New exports, env vars, or config keys
- Tier (Tier 1 core / Tier 2 standard / Tier 3 optional peer dep)
### Out of scope
- What we're deliberately not doing
- Adjacent work that belongs in a separate issue
### Flow (optional)
Ordered steps — e.g. `trigger → resolve → fetch → degrade`. Useful when the change spans multiple phases or fallbacks.
### Design / Tradeoffs (optional)
Philosophy: **one-line principle in bold.**
| Option | Strengths | Weaknesses |
|:---|:---|:---|
| A | ... | ... |
| B | ... | ... |
### Dependencies (optional)
- Depends on: owner/repo#N
ISSUE
)"
Following Up
# Check issue status (with comment thread)
gh issue view <number> -R cyanheads/mcp-ts-core --comments
# Add context or respond to maintainer questions
gh issue comment <number> -R cyanheads/mcp-ts-core --body "Additional context..."
# List your open issues
gh issue list -R cyanheads/mcp-ts-core --author @me
Checklist
Confirmed bug is in @cyanheads/mcp-ts-core, not server code
Running latest (or documented) framework version
Searched existing issues — no duplicate found
If documentation or contract enhancement: confirmed src/, docs/, framework-skills/, and public exports don't already cover the surface
If bug: version, runtime, repro code, actual vs expected behavior included
If feature: Use case and Proposed API present (the form's required fields), Alternatives considered third; Out of scope defined
1---2name: report-issue-framework3description: File a bug or feature request against @cyanheads/mcp-ts-core when you hit a framework issue. Use when a builder, utility, context method, or config behaves contrary to the documented API — not for server-specific application bugs.4---56## When to Use78You've isolated a problem to `@cyanheads/mcp-ts-core` itself — not your server code, not a misconfiguration, not a missing peer dependency. Typical triggers:910- Framework builder (`tool()`, `resource()`, `prompt()`) rejects valid input or produces incorrect output11- `createApp()` or `createWorkerHandler()` fails on a valid config12- `Context` properties (`ctx.log`, `ctx.state`, `ctx.inputs`, etc.) behave contrary to docs13- A utility from `/utils`, `/errors`, `/auth`, `/storage`, `/services` returns wrong results or throws unexpectedly14- Type exports are incorrect or missing (compile error on documented usage)15- The definition linter (`bun run lint:mcp`) produces false positives or misses real violations1617For general `gh` CLI workflows outside issue filing (PRs, workflows, API access), see the `github-cli` skill.1819## Before Filing20211. **Confirm framework version** — `bun pm ls @cyanheads/mcp-ts-core` or check `node_modules/@cyanheads/mcp-ts-core/package.json`222. **Check you're on latest** — `bun outdated @cyanheads/mcp-ts-core`. If behind, update and retest before filing.233. **Isolate the issue** — reproduce with a minimal handler or standalone script. Strip server-specific services, config, and dependencies. If the bug disappears when isolated, it's likely in your server code.244. **Search existing issues** — don't file duplicates:2526```bash27gh issue list -R cyanheads/mcp-ts-core --search "your error message or keyword" --state all2829# Assess a close match before commenting — is it already linked to a fix or referenced elsewhere?30gh issue view <number> -R cyanheads/mcp-ts-core --comments31gh api 'repos/cyanheads/mcp-ts-core/issues/<number>/timeline' --paginate \32 --jq '.[] | select(.event=="cross-referenced") | .source.issue | "\(.repository.full_name)#\(.number) — \(.title)"'33```34355. **For documentation- or contract-shaped requests, audit all three doc layers first** — proposals to add reference docs, public-API conventions, attribute/event catalogs, or stability commitments often duplicate surface that already exists. Check `src/` for behavior, `docs/` for human-facing reference, and `framework-skills/` for agent-facing reference. Skill files marked `audience: external` are the framework's public contract — treat them as authoritative when evaluating whether a documentation gap exists. Also verify the constants or types you'd reference aren't already exported from `@cyanheads/mcp-ts-core` or one of its subpaths.3637## Writing Well-Structured Issues3839Good issues are scannable, concrete, and self-contained — terse and fact-dense. Default to one or two sentences per bullet; if a bullet runs long, split it or cut it. These patterns apply to both bugs and features — the guidance targets any prose block (Description, Additional context, feature proposals).4041- **Lead with specifics.** Name the tool, function, module, or symptom. "Currently `createApp()` throws `ConfigurationError` when `MCP_HTTP_PORT` is set to `0`" beats "There's a problem with the config." A reader should know what's broken or missing before the end of the first sentence.42- **Embed library/service links on first mention.** `[Hono](https://hono.dev/)`, `[linkedom](https://github.com/WebReflection/linkedom)`. Link to the canonical repo or homepage so readers can verify the dependency and reach docs in one click.43- **Use `owner/repo#N` for cross-repo issue references.** GitHub auto-renders them as linked references (e.g. `cyanheads/pubmed-mcp-server#34`). Bare `#N` only works for same-repo issues.44- **Add a `Related: #N` line** near the top when the issue grows from prior context (discussions, other issues, PRs). Makes provenance clickable.45- **Cite cross-references once per body.** Link an issue/PR in `Related:`, the description, or Additional context — not all three. The reader sees them all; redundant linking dilutes signal.46- **Lead design sections with a philosophy sentence.** Bold a short principle before the tradeoff details — e.g. "Philosophy: **fail fast on config errors, degrade gracefully on runtime errors.**" Establishes the lens for the rest of the section.47- **Prefer Markdown tables for comparisons.** When showing options, tiers, strategies, or tradeoffs — tables are the highest-density format for scanning N rows × M attributes.48- **Separate `### Scope` from `### Out of scope`.** The latter is as important as the former — it pre-empts scope-creep debates in comments and signals you've thought about the boundaries.49- **Use `Depends on: owner/repo#N`** to declare ordering explicitly when implementation is blocked on another issue landing first.50- **Cut what dilutes the signal.** Mechanism walkthroughs (link the PR or doc instead), ceremonial framings ("This issue covers…"), conversation references ("as discussed", "per offline"), and kitchen-sink Additional context blocks. If a paragraph isn't pulling weight, drop it.51- **Skip collaborator-framing sign-offs.** Lines like "Happy to open a PR", "let me know if you'd like", "willing to contribute", "if that's the preferred flow" read as noise. A PR link beats an offer; if you're the maintainer filing against your own repo, the offer is redundant. End the body at the last substantive point.5253## Redact Before Posting5455GitHub issues are **public**. Do not include secrets, credentials, API keys, or tokens. Redact sensitive values from env vars, headers, and logs before submitting. Replace with obvious placeholders: `REDACTED`, `sk-...REDACTED`. Do not rely on partial masking — partial keys can still be exploited.5657## Filing a Bug5859The repo has YAML form issue templates. Use `--web` to open the form in the browser (preferred when available), or pass `--title` + `--body` for non-interactive use.6061### Browser (interactive)6263```bash64gh issue create -R cyanheads/mcp-ts-core --template "Bug Report" --web65```6667### CLI (non-interactive)6869Structure the `--body` to match the template's form fields:7071````bash72gh issue create -R cyanheads/mcp-ts-core \73 --title "bug(scope): concise description" \74 --label "bug" \75 --assignee "@me" \76 --body "$(cat <<'ISSUE'77### mcp-ts-core version78790.1.298081### Runtime8283Bun8485### Runtime version8687Bun 1.3.x8889### Transport9091stdio9293### OS9495macOS 15.x9697### Description9899Brief explanation of the bug — what you expected vs what happened.100101### Reproduction102103```ts104import { tool, z } from '@cyanheads/mcp-ts-core';105106export const broken = tool('broken_example', {107 description: 'Minimal repro.',108 input: z.object({ id: z.string().describe('ID') }),109 output: z.object({110 name: z.string().describe('Name'),111 extra: z.string().optional().describe('Optional field'),112 }),113 async handler(input, ctx) {114 return { name: 'test' }; // omitting optional field causes validation error115 },116});117```118119### Actual behavior120121```122Error: Output validation failed: ...123```124125### Expected behavior126127Omitting an optional output field should pass validation.128129### Additional context130131Any workarounds, related issues, or observations.132ISSUE133)"134````135136### Title conventions137138Format: `bug(<scope>): concise description`139140| Scope | When |141|:------|:-----|142| `tool` | Tool builder, handler, format, annotations |143| `resource` | Resource builder, handler, list, params |144| `prompt` | Prompt builder, generate, args |145| `context` | Context, logger, state, progress, elicit |146| `config` | AppConfig, parseConfig, env parsing |147| `errors` | McpError, error factories, typed contracts (`errors[]` / `ctx.fail`), conformance lint, `httpErrorFromResponse`, auto-classification |148| `auth` | Auth modes, scope checking, JWT/OAuth |149| `storage` | StorageService, providers |150| `transport` | stdio/http transport, SSE, session handling |151| `worker` | createWorkerHandler, Worker runtime |152| `utils` | Utilities (formatting, parsing, pagination, etc.) |153| `linter` | Definition linter false positives/negatives |154| `types` | Type exports, type inference |155| `services` | LLM, Speech, Graph services |156| `deps` | Dependency issues, peer dep conflicts |157158### Labels159160Every issue needs exactly one primary label. Stack secondary labels on top when applicable.161162**Primary (required — pick one):**163164| Label | When |165|:------|:-----|166| `bug` | Something broken |167| `enhancement` | Feature request or improvement |168| `documentation` | Documentation is wrong, missing, or misleading |169170**Secondary (optional — stack on top of primary):**171172| Label | When |173|:------|:-----|174| `regression` | Worked before, broken after an update |175| `performance` | Memory, CPU, latency, or resource usage |176| `security` | Vulnerability, CVE, or hardening work |177| `breaking-change` | Fix/feature will break public API; requires a major bump |178| `surplus-token-idea` | Worth exploring when token budget allows |179180Combine labels: `--label "bug" --label "regression"`.181182### Attaching logs or stack traces183184For long output, write to a file and attach. Note: `--body-file` replaces the entire body — it does not supplement a `--body` flag. For structured bugs with logs, either embed the log content in the `Additional context` section of a normal `--body`, or file the issue first and add the log as a comment:185186```bash187bun run rebuild && bun run start:stdio 2>&1 | head -100 > /tmp/mcp-error.log188189# As part of a new issue (the log becomes the entire body — no template fields)190gh issue create -R cyanheads/mcp-ts-core \191 --title "bug(transport): stdio crashes on large payload" \192 --label "bug" \193 --assignee "@me" \194 --body-file /tmp/mcp-error.log195196# Or as a comment on an existing issue197gh issue comment <number> -R cyanheads/mcp-ts-core --body-file /tmp/mcp-error.log198```199200## Filing a Feature Request201202### Browser (interactive)203204```bash205gh issue create -R cyanheads/mcp-ts-core --template "Feature Request" --web206```207208### CLI (non-interactive)209210The first three headings are the Feature Request form's own fields, in its order — `Use case` and `Proposed API` are required by the form, so a body without them does not satisfy it. Everything after `Alternatives considered` is supplemental; omit what you don't need — simple requests don't require Flow / Design / Dependencies blocks.211212````bash213gh issue create -R cyanheads/mcp-ts-core \214 --title "feat(scope): concise description" \215 --label "enhancement" \216 --assignee "@me" \217 --body "$(cat <<'ISSUE'218### Use case219220One or two sentences: who hits this gap in the framework and why it matters. Name the specific builder, utility, context method, or config field. Kept short on purpose — a field that invites a paragraph gets padded with background and skipped by the next reader.221222Related: #N223224### Proposed API225226What you want the framework to do, then the API as a consumer would call it. Link external libraries on first mention: [lib name](https://github.com/owner/repo).227228```ts229import { withRetry } from '@cyanheads/mcp-ts-core/utils';230231const result = await withRetry(() => fetchExternal(url), {232 maxAttempts: 3,233 backoff: 'exponential',234});235```236237### Alternatives considered238239What you tried or evaluated instead, and why it didn't fit.240241### Scope242243- Files or modules touched244- New exports, env vars, or config keys245- Tier (Tier 1 core / Tier 2 standard / Tier 3 optional peer dep)246247### Out of scope248249- What we're deliberately not doing250- Adjacent work that belongs in a separate issue251252### Flow (optional)253254Ordered steps — e.g. `trigger → resolve → fetch → degrade`. Useful when the change spans multiple phases or fallbacks.255256### Design / Tradeoffs (optional)257258Philosophy: **one-line principle in bold.**259260| Option | Strengths | Weaknesses |261|:---|:---|:---|262| A | ... | ... |263| B | ... | ... |264265### Dependencies (optional)266267- Depends on: owner/repo#N268ISSUE269)"270````271272## Following Up273274```bash275# Check issue status (with comment thread)276gh issue view <number> -R cyanheads/mcp-ts-core --comments277278# Add context or respond to maintainer questions279gh issue comment <number> -R cyanheads/mcp-ts-core --body "Additional context..."280281# List your open issues282gh issue list -R cyanheads/mcp-ts-core --author @me283```284285## Checklist286287- [ ] Confirmed bug is in `@cyanheads/mcp-ts-core`, not server code288- [ ] Running latest (or documented) framework version289- [ ] Searched existing issues — no duplicate found290- [ ] If documentation or contract enhancement: confirmed `src/`, `docs/`, `framework-skills/`, and public exports don't already cover the surface291- [ ] All secrets, credentials, and tokens redacted292- [ ] Primary label assigned (`bug` / `enhancement` / `documentation`)293- [ ] If bug: version, runtime, repro code, actual vs expected behavior included294- [ ] If feature: `Use case` and `Proposed API` present (the form's required fields), `Alternatives considered` third; Out of scope defined
Run npx skillmds@latest add cyanheads/report-issue-framework in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
File a bug or feature request against @cyanheads/mcp-ts-core when you hit a framework issue. Use when a builder, utility, context method, or config behaves contrary to the documented API — not for server-specific application bugs. It is listed under AI & ML on SkillMD.
This skill has not completed SkillMD's automated safety review yet. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free, and the skill stays under its author's original license.
cyanheads (@cyanheads) published this skill. Their other Agent Skills are listed on their SkillMD profile.