@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 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 misarblog_login in Claude Code to authenticate via browser
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 misarblog_login
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 `misarblog_login` browser flow.
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 misarblog_get_profile
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 misarblog_get_profile` — the tool card should appear.
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 `misarblog_*` tools appear in GitHub Copilot Chat when
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 `misarblog_login` after connecting)
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 misarblog_login
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
- `misarblog_login` as your first tool call. The flow:
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 misarblog_login
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 registers **23 tools**. Names are used verbatim (e.g. `publish_article`) your MCP
365
- client selects them from natural-language requests. Most require an `mbk_` key; the two public tools
366
- (`list_comments`, `get_follow_status`) need none.
367
-
368
- | Area | Tools |
369
- | ---- | ----- |
370
- | Connection & account | `login`, `status`, `get_profile` |
371
- | Articles & drafts | `list_my_articles`, `get_article`, `publish_article`, `create_draft` |
372
- | Series | `get_series`, `create_series`, `add_to_series` |
373
- | AI writing | `research_topic`, `generate_title_seo`, `suggest_titles` |
374
- | Images | `upload_image`, `generate_cover_image` |
375
- | Analytics | `get_analytics_summary` |
376
- | Comments & follows (public) | `list_comments`, `get_follow_status` |
377
- | Newsletter | `list_newsletter_subscribers`, `list_newsletter_issues` |
378
- | Reactions | `get_reactions`, `add_reaction`, `remove_reaction` |
379
-
380
- Full parameter tables, return shapes, and example prompts for every tool live in the
381
- **[MCP Tools Reference](https://docs.misar.io/blog/mcp/tools)**.
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 `misarblog_login`):
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 `misarblog_login` once to save it to `~/.misarblog/config.json`
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 `misarblog_login` again to get a fresh key via the browser flow.
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 `misarblog_login`
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 12 tools.
715
+ You should see a JSON response listing 23 tools.
512
716
 
513
- ### Connection refused on `misarblog_login` callback
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.5" });
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.5",
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: