code-shot
README.md
> **Moved.** This GitHub copy is an archive. Use the Forgejo repository.
>
> **Canonical repository:** https://git.simonharms.com/thesimonharms/code-shot
# @thesimonharms/code-shot
**MCP server that renders source code as beautiful images.** Perfect for AI agents to show code visually to humans on mobile devices, or for sharing syntax-highlighted snippets.
## Example

Generated from this TypeScript snippet with `theme: github-dark` and `title: greet.ts`:
```typescript
function greet(name: string): string {
const message = `Hello, ${name}!`;
return message;
}
console.log(greet('world'));
```
## Tools
### `render_code`
Render source code as SVG or PNG with full syntax highlighting.
| Param | Type | Default | Description |
|-------|------|---------|-------------|
| `code` | string | **required** | Source code to render |
| `language` | string | auto-detect | Language (ts, rust, py, go, js, and 40+ more) |
| `theme` | string | `github-dark` | Color theme (nord, dracula, catppuccin, one-dark-pro, etc.) |
| `title` | string | — | Window title bar text (e.g. filename) |
| `show_line_numbers` | boolean | `true` | Line number gutter |
| `font_size` | number | `14` | Font size in px |
| `output_format` | `svg\|png` | `svg` | SVG is crisp & copyable; PNG is raster |
| `width` | number | auto | Code area width in characters |
| `padding` | number | `16` | Padding in px |
### `render_diff`
Render a git unified diff with color-coded additions/deletions and **language-aware syntax highlighting**.
| Param | Type | Default | Description |
|-------|------|---------|-------------|
| `diff` | string | **required** | Unified diff content (`git diff` output) |
| `highlight_language` | string | auto-detect | Language for highlighting within hunks. Auto-detected from `diff --git` header (e.g. `file.ts` → TypeScript). Set to `"diff"` for plain diff highlighting. |
| ... | — | — | Same options as `render_code` |
Diff lines are highlighted with:
- `@@` hunk headers → blue background
- `+` additions → green background (`#1b4520` dark / `#dafbe1` light)
- `-` deletions → red background (`#4f1818` dark / `#ffebe9` light)
Syntax highlighting is applied per-hunk in the detected language — not just plain diff markup.
## Themes
18 bundled themes:
| Dark | Light |
|------|-------|
| github-dark | github-light |
| nord | one-light |
| one-dark-pro | material-theme-lighter |
| dracula | min-light |
| dracula-soft | solarized-light |
| catppuccin-mocha | catppuccin-latte |
| material-theme | vitesse-light |
| min-dark | — |
| solarized-dark | — |
| vitesse-dark | — |
## Test Suite
46 tests across two runners:
```
npm test # Build → MCP integration tests (cobasaja) → Unit tests (node --test)
```
- **5 MCP integration tests** (`tests/code-shot.test.ts`) — tool discovery, rendering, error cases
- **37 unit tests** (`tests/*.node-test.ts`) — renderSvg structure, diffToLines parsing, guessLanguage heuristics
## Usage with Hermes
Add to `~/.hermes/config.yaml`:
```yaml
mcp_servers:
code-shot:
command: "npx"
args: ["-y", "@thesimonharms/code-shot"]
```
Or from local build:
```yaml
mcp_servers:
code-shot:
command: "node"
args: ["/path/to/code-shot/dist/index.js"]
```
## Configuration
Set defaults via `~/.code-shotrc` (JSON):
```json
{
"theme": "nord",
"show_line_numbers": true,
"font_size": 14,
"padding": 16
}
```
Also checked (in order): `~/.code-shotrc` > `~/.code-shotrc.json` > `~/.config/code-shot/config.json`.
Tool call arguments override config file values.
## Usage with Claude Code / Cursor
```json
{
"mcpServers": {
"code-shot": {
"command": "node",
"args": ["/path/to/code-shot/dist/index.js"]
}
}
}
```
## Development
```bash
npm install
npm run build # tsc
npm test # build + cobasaja + node --test
```
## How it works
1. **Shiki** tokenizes the code with full syntax highlighting (grammars for 40+ languages)
2. **SVG renderer** builds a pixel-perfect SVG with monospace positioning, window chrome, line numbers, and diff markers
3. **Optional PNG** via `@resvg/resvg-js` for platforms that don't support SVG natively
4. **Language auto-detection** via shebang parsing and code heuristics (18 language patterns)
5. **Diff language detection** from `diff --git a/file.ext b/file.ext` headers
No browser, no DOM, no headless Chromium — pure math-based SVG generation.
## License
MIT
TDQS
A4.2/5.0
Scored across 2 tools
Disambiguation5/5
Each tool targets a distinct input: render_code handles source code blocks, while render_diff handles unified diffs. No overlap in purpose.
Naming Consistency5/5
Both tools follow the verb_noun pattern (render_code, render_diff), maintaining a consistent naming convention.
Tool Count4/5
Two tools is minimal but appropriate for the narrow domain of code visualization; each tool serves a clear and distinct purpose.
Completeness4/5
The server covers the primary use cases of rendering code and diffs as images. Minor gaps like batch rendering or line numbers are not essential but would be nice additions.
Maintenance
ActivitySlowing
ResponsivenessNo issues