lontar-mcp
README.md
> **Moved.** This GitHub copy is an archive. Use the Forgejo repository.
>
> **Canonical repository:** https://git.simonharms.com/thesimonharms/lontar-mcp
# lontar-mcp
MCP server that gives AI agents full blog management over a [Lontar](https://github.com/thesimonharms/lontar) headless blogging API — list and read published posts, draft new content, publish, update, and delete.
Lontar is a Laravel package; this server talks to its HTTP API so agents can manage a blog without touching the CMS UI.
## Tools
| Tool | Auth | Description |
|------|------|-------------|
| `list_posts` | No | List published posts (paginated) |
| `get_post` | No | Get a published post by slug, including rendered HTML body |
| `list_drafts` | Yes | List draft posts (paginated) |
| `create_post` | Yes | Create a new post (draft by default) |
| `update_post` | Yes | Update an existing post by slug |
| `delete_post` | Yes | Permanently delete a post |
| `publish_post` | Yes | Publish a draft (sets `published_at` to now) |
| `unpublish_post` | Yes | Unpublish a post (clears `published_at`) |
### `list_posts` / `list_drafts`
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `page` | `number` | `1` | Page number |
### `get_post`
| Parameter | Type | Description |
|-----------|------|-------------|
| `slug` | `string` | Post slug |
### `create_post`
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `title` | `string` | — | Post title (slug auto-generated) |
| `body` | `string` | — | Post body (Markdown) |
| `excerpt` | `string` | — | Short excerpt |
| `published_at` | `string` | — | ISO 8601 date; omit to save as draft |
### `update_post`
| Parameter | Type | Description |
|-----------|------|-------------|
| `slug` | `string` | Current post slug |
| `title` | `string` | New title (regenerates slug) |
| `body` | `string` | New body (Markdown) |
| `excerpt` | `string \| null` | New excerpt |
| `published_at` | `string \| null` | New publish date, or `null` to unpublish |
### `delete_post` / `publish_post` / `unpublish_post`
| Parameter | Type | Description |
|-----------|------|-------------|
| `slug` | `string` | Post slug |
All tool responses are JSON strings in the MCP text content field.
## Install
```bash
npm install lontar-mcp
```
Or clone and build locally:
```bash
git clone https://github.com/thesimonharms/lontar-mcp.git
cd lontar-mcp
npm install
npm run build
```
Requires Node.js 18+.
## Environment variables
| Variable | Required | Description |
|----------|----------|-------------|
| `LONTAR_API_URL` | Yes | API base URL, e.g. `https://example.com/api` |
| `LONTAR_API_TOKEN` | For write ops | Laravel Sanctum bearer token |
## MCP configuration
### Cursor / Claude Desktop
```json
{
"mcpServers": {
"lontar": {
"command": "node",
"args": ["C:/absolute/path/to/lontar-mcp/dist/index.js"],
"env": {
"LONTAR_API_URL": "https://your-blog.example.com/api",
"LONTAR_API_TOKEN": "your-sanctum-token"
}
}
}
}
```
If installed globally or via `npx`:
```json
{
"mcpServers": {
"lontar": {
"command": "npx",
"args": ["lontar-mcp"],
"env": {
"LONTAR_API_URL": "https://your-blog.example.com/api",
"LONTAR_API_TOKEN": "your-sanctum-token"
}
}
}
}
```
## Examples
**List published posts**
```json
{ "page": 1 }
```
**Get a post**
```json
{ "slug": "hello-world" }
```
**Create a draft**
```json
{
"title": "My New Post",
"body": "# Hello\n\nMarkdown content here.",
"excerpt": "A short summary"
}
```
**Publish a draft**
```json
{ "slug": "my-new-post" }
```
## Development
```bash
npm run build # bundle server to dist/
npm start # run on stdio
npm test # build + run cobasaja tests
```
Tests live in `tests/` and use [cobasaja](https://www.npmjs.com/package/cobasaja) to spawn the server over stdio against an in-memory mock API, asserting tool behaviour end-to-end.
## License
MIT © [Simon Harms](https://github.com/thesimonharms)TDQS
A4/5.0
Scored across 8 tools
Disambiguation5/5
Each tool targets a distinct action on posts or drafts: create, delete, get, list drafts, list published, publish, unpublish, update. No overlapping purposes.
Naming Consistency5/5
All tool names follow a consistent verb_noun pattern (e.g., create_post, list_drafts, publish_post), making predictions easy.
Tool Count5/5
8 tools cover the core blog post lifecycle without being excessive or too sparse. Each tool serves a clear role.
Completeness4/5
Covers full CRUD plus draft/publish state management. Minor gap: no search or filtering tools, but core workflow is complete.
Maintenance
ActivityMaintained
ResponsivenessNo issues