npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

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

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 setup

You 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-interactive

Other 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 --help

Register 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:

  1. Easy to read — clean paragraphs, natural rhythm.
  2. No jargon overload — explain technical terms briefly; avoid unnecessary English-only terminology.
  3. 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:

  1. OS keychain (service tkhrn-devlog-mcp, accounts BLOG_LAMBDA_URL and LAMBDA_API_KEY).
  2. Environment variables of the same name.
  3. If both are missing, the tool call returns a MissingCredentialsError with instructions to run setup.

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 source

Release preparation:

npm pack --dry-run   # verify tarball contents
npm publish          # (requires npm login; access: public)

License

MIT © Jangchun Lee