tkhrn-devlog-mcp
v1.0.1
Published
MCP server that publishes blog posts to tkhrn devlog via AWS Lambda + GitHub PR. Credentials stored in OS keychain.
Downloads
277
Maintainers
Readme
tkhrn-devlog-mcp
MCP (Model Context Protocol) server that publishes blog posts to the tkhrn devlog repository by creating a GitHub Pull Request via an AWS Lambda.
Credentials are stored in the OS keychain by default (macOS Keychain, Windows Credential Manager, Linux libsecret), so downstream Claude Code / MCP clients only need to reference the package — no environment variables in their config.
Architecture
Claude Code / MCP client
↓ stdio
tkhrn-devlog-mcp (this package, local via npx)
↓ HTTPS + Bearer token (resolved from keychain)
AWS Lambda Function URL
↓
GitHub API (creates branch, commits post, opens PR)
↓
GitHub Actions → S3 (on merge)Install & configure
One-time setup on each machine:
npx tkhrn-devlog-mcp setupYou will be prompted for the Lambda Function URL and the Lambda API key. Both
are stored in the OS keychain under the service name tkhrn-devlog-mcp.
Non-interactive variant (CI, scripts):
npx tkhrn-devlog-mcp setup \
--url "https://xxxxxxxx.lambda-url.ap-northeast-2.on.aws/" \
--key "$LAMBDA_API_KEY" \
--non-interactiveOther setup commands:
npx tkhrn-devlog-mcp setup --show # list which values are stored (values hidden)
npx tkhrn-devlog-mcp setup --reset # remove credentials from the keychain
npx tkhrn-devlog-mcp setup --verify # after saving, send a test request to the Lambda
npx tkhrn-devlog-mcp setup --helpRegister with Claude Code
Add the server to your MCP config (e.g. project-level .mcp.json). No
environment variables are required because credentials come from the keychain.
{
"mcpServers": {
"devlog": {
"command": "npx",
"args": ["-y", "tkhrn-devlog-mcp"]
}
}
}If you prefer environment variables (CI containers, ephemeral machines, etc.),
set BLOG_LAMBDA_URL and LAMBDA_API_KEY — the server falls back to env when
a key is not found in the keychain.
Tool
process_blog_content
Creates a new blog post in the target repository as a GitHub Pull Request.
Input:
| field | type | required | description |
| --------- | ---------- | -------- | ----------------------------------------------------- |
| title | string | yes | Post title (converted to kebab-case for the filename) |
| excerpt | string | yes | 1–2 sentence summary |
| content | string | yes | Markdown body |
| tags | string[] | no | Tags for categorization |
Response (stringified JSON):
{
"status": "success",
"prUrl": "https://github.com/<owner>/<repo>/pull/123",
"branchName": "blog-post/1700000000000",
"filename": "2026-04-19-my-first-post.md",
"message": "Pull Request created successfully! Review and merge at: ..."
}Errors are returned with status: "error" and an error message.
Writing style
The MCP tool's description and content field guide the calling LLM (Claude
etc.) to produce posts that match the conventions of devlog.tkhrn.com —
markdown rules, heading hierarchy, list usage, blockquote frequency, Korean
declarative endings, References section format, and so on.
The full guide lives in WRITING_STYLE.md at the package
root. Three principles override every specific rule:
- Easy to read — clean paragraphs, natural rhythm.
- No jargon overload — explain technical terms briefly; avoid unnecessary English-only terminology.
- Clear topic & context — one paragraph per topic; obvious section transitions.
When the rendering pipeline changes (e.g. remark-breaks is removed or a new
component is added), update both WRITING_STYLE.md and the corresponding tool
descriptions in src/index.ts so the LLM receives consistent guidance.
Credential resolution
Order (first non-empty wins), applied per key:
- OS keychain (service
tkhrn-devlog-mcp, accountsBLOG_LAMBDA_URLandLAMBDA_API_KEY). - Environment variables of the same name.
- If both are missing, the tool call returns a
MissingCredentialsErrorwith instructions to runsetup.
No credentials are ever written to disk outside the keychain, and API key values are never logged.
Migrating from older setups
If you previously registered the server with inline env vars:
{
"mcpServers": {
"devlog": {
"command": "node",
"args": ["/abs/path/tkhrn-devlog-mcp/dist/index.js"],
"env": {
"BLOG_LAMBDA_URL": "...",
"LAMBDA_API_KEY": "..."
}
}
}
}Switch to the published package:
{
"mcpServers": {
"devlog": {
"command": "npx",
"args": ["-y", "tkhrn-devlog-mcp"]
}
}
}Then run npx tkhrn-devlog-mcp setup once to move the values into the
keychain. The env-var form continues to work if you prefer to keep it.
Development
npm install
npm run build # type-check and emit dist/
npm run dev # run the MCP server from source (stdio)
npm run setup # run the setup command from sourceRelease preparation:
npm pack --dry-run # verify tarball contents
npm publish # (requires npm login; access: public)License
MIT © Jangchun Lee
