@misarblog/mcp 1.0.5 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +238 -34
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/smithery.yaml +1 -1
package/README.md
CHANGED
|
@@ -45,13 +45,13 @@ chmod +x ~/.claude/scripts/misarblog-mcp.py
|
|
|
45
45
|
|
|
46
46
|
# 2. Add to Claude Code MCP settings (see below)
|
|
47
47
|
|
|
48
|
-
# 3. Run
|
|
48
|
+
# 3. Run login in Claude Code to authenticate via browser
|
|
49
49
|
```
|
|
50
50
|
|
|
51
51
|
**Fastest path — npx + any MCP client:**
|
|
52
52
|
|
|
53
53
|
```bash
|
|
54
|
-
# No install needed — just add the config below and run
|
|
54
|
+
# No install needed — just add the config below and run login
|
|
55
55
|
```
|
|
56
56
|
|
|
57
57
|
---
|
|
@@ -101,7 +101,7 @@ If you're on macOS with an older system Python, use Homebrew: `brew install pyth
|
|
|
101
101
|
}
|
|
102
102
|
```
|
|
103
103
|
|
|
104
|
-
> You can omit `MISARBLOG_API_KEY` if you plan to use the `
|
|
104
|
+
> You can omit `MISARBLOG_API_KEY` if you plan to use the `login` browser flow.
|
|
105
105
|
|
|
106
106
|
---
|
|
107
107
|
|
|
@@ -197,7 +197,7 @@ code ~/.claude/settings.json
|
|
|
197
197
|
**Verify the connection:**
|
|
198
198
|
|
|
199
199
|
```text
|
|
200
|
-
> call
|
|
200
|
+
> call get_profile
|
|
201
201
|
```
|
|
202
202
|
|
|
203
203
|
Claude Code should return your username, display name, and account status.
|
|
@@ -236,7 +236,7 @@ project (project-scoped, takes priority).
|
|
|
236
236
|
- **Env**: `MISARBLOG_API_KEY=mbk_your_key_here`
|
|
237
237
|
4. Click **Save** — Cursor restarts the MCP daemon automatically.
|
|
238
238
|
|
|
239
|
-
Verify: open Cursor Agent mode → type `use
|
|
239
|
+
Verify: open Cursor Agent mode → type `use get_profile` — the tool card should appear.
|
|
240
240
|
|
|
241
241
|
---
|
|
242
242
|
|
|
@@ -303,7 +303,7 @@ VS Code reads MCP config from `.vscode/mcp.json` in the workspace root, or from
|
|
|
303
303
|
}
|
|
304
304
|
```
|
|
305
305
|
|
|
306
|
-
Restart VS Code after saving. The
|
|
306
|
+
Restart VS Code after saving. The Misar.Blog tools appear in GitHub Copilot Chat when
|
|
307
307
|
you enable **Agent mode** (the `@` icon in the chat panel).
|
|
308
308
|
|
|
309
309
|
---
|
|
@@ -315,7 +315,7 @@ Any MCP-compatible client that supports stdio servers works with the same patter
|
|
|
315
315
|
- **Command**: `python3` (Python) or `npx` (npm)
|
|
316
316
|
- **Args**: `["~/.claude/scripts/misarblog-mcp.py"]` or `["-y", "@misarblog/mcp"]`
|
|
317
317
|
- **Transport**: `stdio`
|
|
318
|
-
- **Env**: `MISARBLOG_API_KEY=mbk_...` (or use `
|
|
318
|
+
- **Env**: `MISARBLOG_API_KEY=mbk_...` (or use `login` after connecting)
|
|
319
319
|
|
|
320
320
|
---
|
|
321
321
|
|
|
@@ -332,13 +332,13 @@ Keys have a 100 req/min rate limit. You can revoke and regenerate at any time fr
|
|
|
332
332
|
**Precedence order:**
|
|
333
333
|
|
|
334
334
|
```text
|
|
335
|
-
MISARBLOG_API_KEY env var → ~/.misarblog/config.json → prompt to run
|
|
335
|
+
MISARBLOG_API_KEY env var → ~/.misarblog/config.json → prompt to run login
|
|
336
336
|
```
|
|
337
337
|
|
|
338
338
|
### Browser login (no copy-paste)
|
|
339
339
|
|
|
340
340
|
If you'd rather not handle the key manually, omit `MISARBLOG_API_KEY` from the config and run
|
|
341
|
-
`
|
|
341
|
+
`login` as your first tool call. The flow:
|
|
342
342
|
|
|
343
343
|
1. The MCP server starts a temporary HTTP listener on `127.0.0.1` (random port 9001–9099)
|
|
344
344
|
2. Your default browser opens to `https://www.misar.blog/dashboard/settings/api?mcp_port=<port>`
|
|
@@ -352,7 +352,7 @@ The listener accepts connections from `127.0.0.1` only and shuts down after 120
|
|
|
352
352
|
**Example prompt:**
|
|
353
353
|
|
|
354
354
|
```text
|
|
355
|
-
Connect my Misar.Blog account using
|
|
355
|
+
Connect my Misar.Blog account using login
|
|
356
356
|
```
|
|
357
357
|
|
|
358
358
|
Claude will call the tool, open your browser, and confirm once you've authorized.
|
|
@@ -361,24 +361,228 @@ Claude will call the tool, open your browser, and confirm once you've authorized
|
|
|
361
361
|
|
|
362
362
|
## Tools reference
|
|
363
363
|
|
|
364
|
-
The server
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
|
370
|
-
|
|
|
371
|
-
|
|
|
372
|
-
|
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
|
377
|
-
|
|
|
378
|
-
|
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
364
|
+
The server exposes **23 tools**. Names are unprefixed — call them exactly as
|
|
365
|
+
shown (e.g. `login`, `publish_article`, `get_analytics_summary`).
|
|
366
|
+
|
|
367
|
+
### Auth
|
|
368
|
+
|
|
369
|
+
| Tool | Description | Required params |
|
|
370
|
+
| ---- | ----------- | --------------- |
|
|
371
|
+
| `login` | Browser-based auth — saves key to `~/.misarblog/config.json` | — |
|
|
372
|
+
| `status` | Check whether you're authenticated and which account is connected | — |
|
|
373
|
+
|
|
374
|
+
### Articles
|
|
375
|
+
|
|
376
|
+
| Tool | Description | Required params |
|
|
377
|
+
| ---- | ----------- | --------------- |
|
|
378
|
+
| `list_my_articles` | List your articles, optionally filtered by status | — |
|
|
379
|
+
| `get_article` | Fetch a single article by slug, including full markdown | `slug` |
|
|
380
|
+
| `publish_article` | Publish now or schedule via ISO 8601 datetime | `title`, `body_markdown` |
|
|
381
|
+
| `create_draft` | Save a draft for review in the web editor | `title`, `body_markdown` |
|
|
382
|
+
|
|
383
|
+
### AI
|
|
384
|
+
|
|
385
|
+
| Tool | Description | Required params |
|
|
386
|
+
| ---- | ----------- | --------------- |
|
|
387
|
+
| `research_topic` | Research a topic — insights, sources, and a content outline | `query` |
|
|
388
|
+
| `generate_title_seo` | Generate 5 SEO/AEO/GEO-optimized titles from a topic or keyword | `prompt` |
|
|
389
|
+
| `suggest_titles` | Generate 5 title options from your existing article content | `context` |
|
|
390
|
+
|
|
391
|
+
### Images
|
|
392
|
+
|
|
393
|
+
| Tool | Description | Required params |
|
|
394
|
+
| ---- | ----------- | --------------- |
|
|
395
|
+
| `upload_image` | Upload a local image file to the Misar.Blog CDN | `file_path` |
|
|
396
|
+
| `generate_cover_image` | Generate an AI cover image and upload it to the CDN | `prompt` |
|
|
397
|
+
|
|
398
|
+
### Series
|
|
399
|
+
|
|
400
|
+
| Tool | Description | Required params |
|
|
401
|
+
| ---- | ----------- | --------------- |
|
|
402
|
+
| `get_series` | List all your series | — |
|
|
403
|
+
| `create_series` | Create a new series to group related articles | `title` |
|
|
404
|
+
| `add_to_series` | Add an existing article to a series | `series_slug`, `article_slug` |
|
|
405
|
+
|
|
406
|
+
### Comments
|
|
407
|
+
|
|
408
|
+
| Tool | Description | Required params |
|
|
409
|
+
| ---- | ----------- | --------------- |
|
|
410
|
+
| `list_comments` | Get public comments for an article (no API key required) | `article_id` |
|
|
411
|
+
|
|
412
|
+
### Follows
|
|
413
|
+
|
|
414
|
+
| Tool | Description | Required params |
|
|
415
|
+
| ---- | ----------- | --------------- |
|
|
416
|
+
| `get_follow_status` | Get public follow status and follower count for a user (no API key required) | `user_id` |
|
|
417
|
+
|
|
418
|
+
### Newsletter
|
|
419
|
+
|
|
420
|
+
| Tool | Description | Required params |
|
|
421
|
+
| ---- | ----------- | --------------- |
|
|
422
|
+
| `list_newsletter_subscribers` | Get your newsletter subscriber list | — |
|
|
423
|
+
| `list_newsletter_issues` | Get your sent and scheduled newsletter issues | — |
|
|
424
|
+
|
|
425
|
+
### Reactions
|
|
426
|
+
|
|
427
|
+
| Tool | Description | Required params |
|
|
428
|
+
| ---- | ----------- | --------------- |
|
|
429
|
+
| `get_reactions` | Get reaction counts and your reactions for an article | `article_id` |
|
|
430
|
+
| `add_reaction` | Add a reaction to an article (no-ops if already reacted) | `article_id`, `type` |
|
|
431
|
+
| `remove_reaction` | Remove a specific reaction from an article | `article_id`, `type` |
|
|
432
|
+
|
|
433
|
+
### Analytics
|
|
434
|
+
|
|
435
|
+
| Tool | Description | Required params |
|
|
436
|
+
| ---- | ----------- | --------------- |
|
|
437
|
+
| `get_analytics_summary` | Views, revenue, and subscribers for a time period (up to 365 days) | — |
|
|
438
|
+
|
|
439
|
+
### Profile
|
|
440
|
+
|
|
441
|
+
| Tool | Description | Required params |
|
|
442
|
+
| ---- | ----------- | --------------- |
|
|
443
|
+
| `get_profile` | Your creator profile — username, display name, bio, Stripe status | — |
|
|
444
|
+
|
|
445
|
+
### Tool parameters
|
|
446
|
+
|
|
447
|
+
#### `login`
|
|
448
|
+
|
|
449
|
+
| Param | Type | Default | Description |
|
|
450
|
+
| ----- | ---- | ------- | ----------- |
|
|
451
|
+
| `port` | number | random 9001–9099 | Local callback port (9001–9099) |
|
|
452
|
+
| `base_url` | string | `https://www.misar.blog` | Misar.Blog base URL for self-hosted instances |
|
|
453
|
+
| `force` | boolean | `false` | Force re-authentication even if already logged in (rotates your API key) |
|
|
454
|
+
|
|
455
|
+
#### `list_my_articles`
|
|
456
|
+
|
|
457
|
+
| Param | Type | Default | Description |
|
|
458
|
+
| ----- | ---- | ------- | ----------- |
|
|
459
|
+
| `status` | string | all | Filter: `draft` · `published` · `scheduled` · `archived` (omit for all) |
|
|
460
|
+
| `limit` | number | `20` | Number of articles to return, 1–100 |
|
|
461
|
+
|
|
462
|
+
#### `get_article`
|
|
463
|
+
|
|
464
|
+
| Param | Type | Required | Description |
|
|
465
|
+
| ----- | ---- | -------- | ----------- |
|
|
466
|
+
| `slug` | string | yes | The article slug |
|
|
467
|
+
|
|
468
|
+
#### `publish_article`
|
|
469
|
+
|
|
470
|
+
| Param | Type | Required | Description |
|
|
471
|
+
| ----- | ---- | -------- | ----------- |
|
|
472
|
+
| `title` | string | yes | Article title (max 250 chars) |
|
|
473
|
+
| `body_markdown` | string | yes | Full article body in Markdown |
|
|
474
|
+
| `tags` | string[] | no | Up to 10 tags |
|
|
475
|
+
| `cover_image_url` | string | no | URL of the cover image |
|
|
476
|
+
| `schedule_at` | string | no | ISO 8601 timestamp to schedule; omit to publish immediately |
|
|
477
|
+
| `visibility` | string | no | `public` · `subscribers` · `paid` · `private` (default: `public`) |
|
|
478
|
+
|
|
479
|
+
#### `create_draft`
|
|
480
|
+
|
|
481
|
+
| Param | Type | Required | Description |
|
|
482
|
+
| ----- | ---- | -------- | ----------- |
|
|
483
|
+
| `title` | string | yes | Draft title |
|
|
484
|
+
| `body_markdown` | string | yes | Full article body in Markdown |
|
|
485
|
+
| `tags` | string[] | no | Tags for the draft |
|
|
486
|
+
|
|
487
|
+
#### `research_topic`
|
|
488
|
+
|
|
489
|
+
| Param | Type | Required | Description |
|
|
490
|
+
| ----- | ---- | -------- | ----------- |
|
|
491
|
+
| `query` | string | yes | Research topic or question (5–500 chars). Be specific for best results |
|
|
492
|
+
|
|
493
|
+
#### `generate_title_seo`
|
|
494
|
+
|
|
495
|
+
| Param | Type | Required | Description |
|
|
496
|
+
| ----- | ---- | -------- | ----------- |
|
|
497
|
+
| `prompt` | string | yes | Your topic or target keywords (3–500 chars) |
|
|
498
|
+
| `context` | string | no | Existing article content (plain text or markdown, max 8000 chars) to align titles |
|
|
499
|
+
|
|
500
|
+
#### `suggest_titles`
|
|
501
|
+
|
|
502
|
+
| Param | Type | Required | Description |
|
|
503
|
+
| ----- | ---- | -------- | ----------- |
|
|
504
|
+
| `context` | string | yes | Your article content in plain text or markdown (20–8000 chars) |
|
|
505
|
+
|
|
506
|
+
#### `upload_image`
|
|
507
|
+
|
|
508
|
+
| Param | Type | Required | Description |
|
|
509
|
+
| ----- | ---- | -------- | ----------- |
|
|
510
|
+
| `file_path` | string | yes | Absolute path to the image file (JPEG, PNG, WebP, or GIF) |
|
|
511
|
+
|
|
512
|
+
#### `generate_cover_image`
|
|
513
|
+
|
|
514
|
+
| Param | Type | Default | Description |
|
|
515
|
+
| ----- | ---- | ------- | ----------- |
|
|
516
|
+
| `prompt` | string | — | Description of the image to generate (max 1000 chars) |
|
|
517
|
+
| `size` | string | `1792x1024` | `1024x1024` · `1792x1024` · `1024x1792` |
|
|
518
|
+
|
|
519
|
+
#### `create_series`
|
|
520
|
+
|
|
521
|
+
| Param | Type | Required | Description |
|
|
522
|
+
| ----- | ---- | -------- | ----------- |
|
|
523
|
+
| `title` | string | yes | Series title |
|
|
524
|
+
| `description` | string | no | Short description of the series |
|
|
525
|
+
|
|
526
|
+
#### `add_to_series`
|
|
527
|
+
|
|
528
|
+
| Param | Type | Required | Description |
|
|
529
|
+
| ----- | ---- | -------- | ----------- |
|
|
530
|
+
| `series_slug` | string | yes | The series slug |
|
|
531
|
+
| `article_slug` | string | yes | The article slug to add |
|
|
532
|
+
| `position` | number | no | 1-indexed position; appends to end if omitted |
|
|
533
|
+
|
|
534
|
+
#### `list_comments`
|
|
535
|
+
|
|
536
|
+
| Param | Type | Default | Description |
|
|
537
|
+
| ----- | ---- | ------- | ----------- |
|
|
538
|
+
| `article_id` | string | — | UUID of the article to fetch comments for (required) |
|
|
539
|
+
| `limit` | number | `20` | Max results, 1–100 |
|
|
540
|
+
| `offset` | number | `0` | Pagination offset |
|
|
541
|
+
|
|
542
|
+
#### `get_follow_status`
|
|
543
|
+
|
|
544
|
+
| Param | Type | Required | Description |
|
|
545
|
+
| ----- | ---- | -------- | ----------- |
|
|
546
|
+
| `user_id` | string | yes | UUID of the profile to check follow status for |
|
|
547
|
+
|
|
548
|
+
#### `list_newsletter_subscribers`
|
|
549
|
+
|
|
550
|
+
| Param | Type | Default | Description |
|
|
551
|
+
| ----- | ---- | ------- | ----------- |
|
|
552
|
+
| `limit` | number | `20` | Max results, 1–100 |
|
|
553
|
+
| `offset` | number | `0` | Pagination offset |
|
|
554
|
+
|
|
555
|
+
#### `list_newsletter_issues`
|
|
556
|
+
|
|
557
|
+
| Param | Type | Default | Description |
|
|
558
|
+
| ----- | ---- | ------- | ----------- |
|
|
559
|
+
| `limit` | number | `10` | Max results, 1–50 |
|
|
560
|
+
|
|
561
|
+
#### `get_reactions`
|
|
562
|
+
|
|
563
|
+
| Param | Type | Required | Description |
|
|
564
|
+
| ----- | ---- | -------- | ----------- |
|
|
565
|
+
| `article_id` | string | yes | UUID of the article |
|
|
566
|
+
|
|
567
|
+
#### `add_reaction`
|
|
568
|
+
|
|
569
|
+
| Param | Type | Required | Description |
|
|
570
|
+
| ----- | ---- | -------- | ----------- |
|
|
571
|
+
| `article_id` | string | yes | UUID of the article |
|
|
572
|
+
| `type` | string | yes | Reaction type: `like` · `clap` · `bookmark` |
|
|
573
|
+
|
|
574
|
+
#### `remove_reaction`
|
|
575
|
+
|
|
576
|
+
| Param | Type | Required | Description |
|
|
577
|
+
| ----- | ---- | -------- | ----------- |
|
|
578
|
+
| `article_id` | string | yes | UUID of the article |
|
|
579
|
+
| `type` | string | yes | Reaction type to remove: `like` · `clap` · `bookmark` |
|
|
580
|
+
|
|
581
|
+
#### `get_analytics_summary`
|
|
582
|
+
|
|
583
|
+
| Param | Type | Default | Description |
|
|
584
|
+
| ----- | ---- | ------- | ----------- |
|
|
585
|
+
| `days` | number | `30` | Look-back window, 1–365 |
|
|
382
586
|
|
|
383
587
|
---
|
|
384
588
|
|
|
@@ -440,7 +644,7 @@ If you run your own Misar.Blog instance, set `MISARBLOG_BASE_URL` to your domain
|
|
|
440
644
|
}
|
|
441
645
|
```
|
|
442
646
|
|
|
443
|
-
`MISARBLOG_BASE_URL` can also be stored in `~/.misarblog/config.json` (written by `
|
|
647
|
+
`MISARBLOG_BASE_URL` can also be stored in `~/.misarblog/config.json` (written by `login`):
|
|
444
648
|
|
|
445
649
|
```json
|
|
446
650
|
{
|
|
@@ -459,19 +663,19 @@ If you run your own Misar.Blog instance, set `MISARBLOG_BASE_URL` to your domain
|
|
|
459
663
|
The server can't find your API key. Either:
|
|
460
664
|
|
|
461
665
|
- Set `MISARBLOG_API_KEY` in the MCP config env block, or
|
|
462
|
-
- Run `
|
|
666
|
+
- Run `login` once to save it to `~/.misarblog/config.json`
|
|
463
667
|
|
|
464
668
|
### "API key invalid or expired"
|
|
465
669
|
|
|
466
670
|
Your key was revoked. Go to **Dashboard → Settings → API Keys** and generate a new one,
|
|
467
|
-
or run `
|
|
671
|
+
or run `login` again to get a fresh key via the browser flow.
|
|
468
672
|
|
|
469
673
|
### "Rate limited (100 req/min)"
|
|
470
674
|
|
|
471
675
|
You've exceeded the API rate limit. Wait 60 seconds and retry. If you're running automated
|
|
472
676
|
pipelines, add a short delay between tool calls.
|
|
473
677
|
|
|
474
|
-
### Browser doesn't open during `
|
|
678
|
+
### Browser doesn't open during `login`
|
|
475
679
|
|
|
476
680
|
The server prints the URL to stderr when `webbrowser.open()` fails. Copy and open it manually:
|
|
477
681
|
|
|
@@ -508,9 +712,9 @@ Run `/mcp` in a Claude Code session to list active servers. If `misarblog` is mi
|
|
|
508
712
|
| MISARBLOG_API_KEY=mbk_test python3 ~/.claude/scripts/misarblog-mcp.py
|
|
509
713
|
```
|
|
510
714
|
|
|
511
|
-
You should see a JSON response listing
|
|
715
|
+
You should see a JSON response listing 23 tools.
|
|
512
716
|
|
|
513
|
-
### Connection refused on `
|
|
717
|
+
### Connection refused on `login` callback
|
|
514
718
|
|
|
515
719
|
The local HTTP server binds to `127.0.0.1`. If your browser opens on a different machine
|
|
516
720
|
(e.g. remote VS Code over SSH), the callback won't reach the MCP server. In that case,
|
package/dist/index.js
CHANGED
|
@@ -13,7 +13,7 @@ import { registerFollowTools } from "./tools/follows.js";
|
|
|
13
13
|
import { registerNewsletterTools } from "./tools/newsletter.js";
|
|
14
14
|
import { registerReactionTools } from "./tools/reactions.js";
|
|
15
15
|
function buildServer() {
|
|
16
|
-
const s = new McpServer({ name: "misarblog", version: "1.0.
|
|
16
|
+
const s = new McpServer({ name: "misarblog", version: "1.0.6" });
|
|
17
17
|
registerLoginTool(s);
|
|
18
18
|
registerStatusTool(s);
|
|
19
19
|
registerProfileTools(s);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@misarblog/mcp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.6",
|
|
4
4
|
"mcpName": "io.github.mrgulshanyadav/misarblog-mcp",
|
|
5
5
|
"description": "MCP server for Misar.Blog — publish blog posts, manage drafts, generate AI cover images, and access analytics from Claude Code, Cursor & Windsurf.",
|
|
6
6
|
"type": "module",
|
package/smithery.yaml
CHANGED
|
@@ -10,7 +10,7 @@ startCommand:
|
|
|
10
10
|
title: API Key
|
|
11
11
|
description: >
|
|
12
12
|
Your Misar.Blog API key (starts with mbk_). Generate one at
|
|
13
|
-
https://www.misar.blog/dashboard/settings/api — or leave blank and
|
|
13
|
+
https://www.misar.blog/dashboard/settings/api-keys — or leave blank and
|
|
14
14
|
run the "login" tool to authenticate via browser.
|
|
15
15
|
x-secret: true
|
|
16
16
|
baseUrl:
|