@motiblog/mcp 0.1.1 → 0.1.2

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/dist/index.js CHANGED
@@ -483,7 +483,7 @@ var toolDefinitions = [
483
483
  name: "get_digest",
484
484
  description: "One-call morning check-in for a project: article counts by lifecycle status, the REVIEW queue (what is waiting to be published, with word counts), posts published in the last 7 days, content plans due in the next 7 days, the latest published post, quota usage, and the project's current autonomy level (L1 = nothing ships without agent review; L2 = clean articles auto-publish). Start every check-in here.",
485
485
  inputSchema: { ...projectIdArg },
486
- annotations: { readOnlyHint: true },
486
+ annotations: { title: "Morning Digest", readOnlyHint: true, destructiveHint: false },
487
487
  async handler(args, ctx) {
488
488
  const projectId = resolveProjectId(ctx, args.project_id);
489
489
  const [project, articles, plans] = await Promise.all([
@@ -500,7 +500,7 @@ var toolDefinitions = [
500
500
  name: "list_projects",
501
501
  description: "List every MotiBlog project the API key can access, with settings that matter to agents: requireApproval (REVIEW vs APPROVED after generation), autoPublish, factCheckStrict, selfHostedBlog, and article quota usage.",
502
502
  inputSchema: {},
503
- annotations: { readOnlyHint: true },
503
+ annotations: { title: "List Projects", readOnlyHint: true, destructiveHint: false },
504
504
  async handler(_args, ctx) {
505
505
  return json(await ctx.client.listProjects());
506
506
  }
@@ -509,7 +509,7 @@ var toolDefinitions = [
509
509
  name: "get_project",
510
510
  description: "Get one MotiBlog project in detail: pipeline settings (aiModel, language, internalLinks, banner), positioning inputs (businessProfile, productTruth, manualPositioning) and quota state.",
511
511
  inputSchema: { ...projectIdArg },
512
- annotations: { readOnlyHint: true },
512
+ annotations: { title: "Project Details", readOnlyHint: true, destructiveHint: false },
513
513
  async handler(args, ctx) {
514
514
  return json(await ctx.client.getProject(resolveProjectId(ctx, args.project_id)));
515
515
  }
@@ -519,6 +519,7 @@ var toolDefinitions = [
519
519
  name: "start_pipeline",
520
520
  description: "Start the autonomous pipeline for a project: site crawl/analysis \u2192 topic selection \u2192 article generation for scheduled plans. Returns immediately; poll get_pipeline_status or list_articles(status=GENERATING) to follow progress.",
521
521
  inputSchema: { ...projectIdArg },
522
+ annotations: { title: "Start Content Pipeline", readOnlyHint: false, destructiveHint: false },
522
523
  async handler(args, ctx) {
523
524
  const projectId = resolveProjectId(ctx, args.project_id);
524
525
  return json(await ctx.client.pipelineStart(projectId));
@@ -528,7 +529,7 @@ var toolDefinitions = [
528
529
  name: "get_pipeline_status",
529
530
  description: "Get current pipeline run state for a project: whether a run is active, its steps, and recent run history. Use after start_pipeline or generate_article.",
530
531
  inputSchema: { ...projectIdArg },
531
- annotations: { readOnlyHint: true },
532
+ annotations: { title: "Pipeline Status", readOnlyHint: true, destructiveHint: false },
532
533
  async handler(args, ctx) {
533
534
  return json(
534
535
  await ctx.client.pipelineStatus(resolveProjectId(ctx, args.project_id))
@@ -543,6 +544,7 @@ var toolDefinitions = [
543
544
  topic: import_zod.z.string().min(1).describe('The proposed topic/title, e.g. "How headless CMSs serve AI agents"'),
544
545
  ...projectIdArg
545
546
  },
547
+ annotations: { title: "Suggest Topics", readOnlyHint: false, destructiveHint: false },
546
548
  async handler(args, ctx) {
547
549
  const projectId = resolveProjectId(ctx, args.project_id);
548
550
  return json(await ctx.client.createContentPlanFromGap(projectId, String(args.topic)));
@@ -552,7 +554,7 @@ var toolDefinitions = [
552
554
  name: "list_content_plans",
553
555
  description: "List the content plan queue for a project with each entry status: DRAFT (proposed), APPROVED (cleared for generation), IN_PROGRESS, COMPLETED.",
554
556
  inputSchema: { ...projectIdArg },
555
- annotations: { readOnlyHint: true },
557
+ annotations: { title: "List Content Plans", readOnlyHint: true, destructiveHint: false },
556
558
  async handler(args, ctx) {
557
559
  return json(await ctx.client.listContentPlans(resolveProjectId(ctx, args.project_id)));
558
560
  }
@@ -564,6 +566,7 @@ var toolDefinitions = [
564
566
  plan_id: import_zod.z.string().describe("Content plan entry id (from list_content_plans)"),
565
567
  ...projectIdArg
566
568
  },
569
+ annotations: { title: "Approve Content Plan", readOnlyHint: false, destructiveHint: false },
567
570
  async handler(args, ctx) {
568
571
  const projectId = resolveProjectId(ctx, args.project_id);
569
572
  return json(await ctx.client.approveContentPlan(projectId, String(args.plan_id)));
@@ -576,6 +579,7 @@ var toolDefinitions = [
576
579
  plan_id: import_zod.z.string().describe("Content plan entry id"),
577
580
  ...projectIdArg
578
581
  },
582
+ annotations: { title: "Regenerate Content Plan", readOnlyHint: false, destructiveHint: true },
579
583
  async handler(args, ctx) {
580
584
  const projectId = resolveProjectId(ctx, args.project_id);
581
585
  return json(await ctx.client.regenerateContentPlan(projectId, String(args.plan_id)));
@@ -588,6 +592,7 @@ var toolDefinitions = [
588
592
  plan_id: import_zod.z.string().describe("Content plan entry id (must be APPROVED)"),
589
593
  ...projectIdArg
590
594
  },
595
+ annotations: { title: "Generate Article", readOnlyHint: false, destructiveHint: false },
591
596
  async handler(args, ctx) {
592
597
  const projectId = resolveProjectId(ctx, args.project_id);
593
598
  return json(await ctx.client.generateArticleFromPlan(projectId, String(args.plan_id)));
@@ -601,7 +606,7 @@ var toolDefinitions = [
601
606
  end_date: import_zod.z.string().describe("ISO date, e.g. 2026-09-30"),
602
607
  ...projectIdArg
603
608
  },
604
- annotations: { readOnlyHint: true },
609
+ annotations: { title: "Content Calendar", readOnlyHint: true, destructiveHint: false },
605
610
  async handler(args, ctx) {
606
611
  const projectId = resolveProjectId(ctx, args.project_id);
607
612
  return json(
@@ -621,7 +626,7 @@ var toolDefinitions = [
621
626
  status: import_zod.z.enum(ARTICLE_STATUSES).optional().describe("Filter by lifecycle status (default REVIEW)"),
622
627
  ...projectIdArg
623
628
  },
624
- annotations: { readOnlyHint: true },
629
+ annotations: { title: "Review Queue", readOnlyHint: true, destructiveHint: false },
625
630
  async handler(args, ctx) {
626
631
  const projectId = resolveProjectId(ctx, args.project_id);
627
632
  const status = typeof args.status === "string" ? args.status : "REVIEW";
@@ -637,7 +642,7 @@ var toolDefinitions = [
637
642
  include_logs: import_zod.z.boolean().optional().describe("Include pipeline phase logs (default false)"),
638
643
  ...projectIdArg
639
644
  },
640
- annotations: { readOnlyHint: true },
645
+ annotations: { title: "Get Article", readOnlyHint: true, destructiveHint: false },
641
646
  async handler(args, ctx) {
642
647
  const projectId = resolveProjectId(ctx, args.project_id);
643
648
  const article = await ctx.client.getArticle(projectId, String(args.article_id));
@@ -659,6 +664,7 @@ var toolDefinitions = [
659
664
  status: import_zod.z.enum(["DRAFT", "REVIEW", "APPROVED"]).optional(),
660
665
  ...projectIdArg
661
666
  },
667
+ annotations: { title: "Update Article", readOnlyHint: false, destructiveHint: true },
662
668
  async handler(args, ctx) {
663
669
  const projectId = resolveProjectId(ctx, args.project_id);
664
670
  const patch = {};
@@ -677,6 +683,12 @@ var toolDefinitions = [
677
683
  publish_now: import_zod.z.boolean().optional().describe("Also trigger publishing now (default false)"),
678
684
  ...projectIdArg
679
685
  },
686
+ annotations: {
687
+ title: "Approve & Publish",
688
+ readOnlyHint: false,
689
+ destructiveHint: true,
690
+ openWorldHint: true
691
+ },
680
692
  async handler(args, ctx) {
681
693
  const projectId = resolveProjectId(ctx, args.project_id);
682
694
  const articleId = String(args.article_id);
@@ -695,6 +707,7 @@ var toolDefinitions = [
695
707
  clear_schedule: import_zod.z.boolean().optional().describe("Clear any scheduled date instead of setting one"),
696
708
  ...projectIdArg
697
709
  },
710
+ annotations: { title: "Schedule Publication", readOnlyHint: false, destructiveHint: false },
698
711
  async handler(args, ctx) {
699
712
  const projectId = resolveProjectId(ctx, args.project_id);
700
713
  const value = args.clear_schedule === true ? null : args.scheduled_for ?? null;
@@ -709,7 +722,7 @@ var toolDefinitions = [
709
722
  article_id: import_zod.z.string().describe("Article id"),
710
723
  ...projectIdArg
711
724
  },
712
- annotations: { destructiveHint: true },
725
+ annotations: { title: "Regenerate Article", readOnlyHint: false, destructiveHint: true },
713
726
  async handler(args, ctx) {
714
727
  const projectId = resolveProjectId(ctx, args.project_id);
715
728
  return json(await ctx.client.regenerateArticle(projectId, String(args.article_id)));
@@ -723,6 +736,7 @@ var toolDefinitions = [
723
736
  chapter_index: import_zod.z.number().int().min(0).describe("Zero-based chapter index"),
724
737
  ...projectIdArg
725
738
  },
739
+ annotations: { title: "Regenerate Chapter", readOnlyHint: false, destructiveHint: true },
726
740
  async handler(args, ctx) {
727
741
  const projectId = resolveProjectId(ctx, args.project_id);
728
742
  return json(
@@ -741,7 +755,7 @@ var toolDefinitions = [
741
755
  article_id: import_zod.z.string().describe("Article id"),
742
756
  ...projectIdArg
743
757
  },
744
- annotations: { readOnlyHint: true },
758
+ annotations: { title: "Pipeline Logs", readOnlyHint: true, destructiveHint: false },
745
759
  async handler(args, ctx) {
746
760
  const projectId = resolveProjectId(ctx, args.project_id);
747
761
  return json(await ctx.client.getPipelineLogs(projectId, String(args.article_id)));
@@ -751,7 +765,7 @@ var toolDefinitions = [
751
765
  name: "list_refresh_suggestions",
752
766
  description: "Across ALL your projects: published articles whose Search Console stats suggest they are decaying and would benefit from a refresh. Feed these back into planning via suggest_topics or update_article.",
753
767
  inputSchema: {},
754
- annotations: { readOnlyHint: true },
768
+ annotations: { title: "Refresh Suggestions", readOnlyHint: true, destructiveHint: false },
755
769
  async handler(_args, ctx) {
756
770
  return json(await ctx.client.listRefreshSuggestions());
757
771
  }
@@ -761,7 +775,7 @@ var toolDefinitions = [
761
775
  name: "list_integrations",
762
776
  description: "List configured publishing targets (integrations) for a project: WEBHOOK, WORDPRESS, GHOST, WEBFLOW, SHOPIFY, DEVTO, SANITY, CUSTOM_API \u2014 with enabled state.",
763
777
  inputSchema: { ...projectIdArg },
764
- annotations: { readOnlyHint: true },
778
+ annotations: { title: "List Integrations", readOnlyHint: true, destructiveHint: false },
765
779
  async handler(args, ctx) {
766
780
  const projectId = resolveProjectId(ctx, args.project_id);
767
781
  const integrations = await ctx.client.listIntegrations(projectId);
@@ -778,6 +792,12 @@ var toolDefinitions = [
778
792
  method: import_zod.z.enum(["POST", "PUT", "PATCH"]).optional().describe("HTTP method (default POST)"),
779
793
  ...projectIdArg
780
794
  },
795
+ annotations: {
796
+ title: "Create Webhook Integration",
797
+ readOnlyHint: false,
798
+ destructiveHint: false,
799
+ openWorldHint: true
800
+ },
781
801
  async handler(args, ctx) {
782
802
  const projectId = resolveProjectId(ctx, args.project_id);
783
803
  const config = { url: String(args.url) };
@@ -801,6 +821,12 @@ var toolDefinitions = [
801
821
  mode: import_zod.z.enum(["ping", "full"]).optional(),
802
822
  ...projectIdArg
803
823
  },
824
+ annotations: {
825
+ title: "Test Integration",
826
+ readOnlyHint: false,
827
+ destructiveHint: false,
828
+ openWorldHint: true
829
+ },
804
830
  async handler(args, ctx) {
805
831
  const projectId = resolveProjectId(ctx, args.project_id);
806
832
  return json(
@@ -820,6 +846,12 @@ var toolDefinitions = [
820
846
  integration_id: import_zod.z.string().describe("Target integration id"),
821
847
  ...projectIdArg
822
848
  },
849
+ annotations: {
850
+ title: "Publish to CMS",
851
+ readOnlyHint: false,
852
+ destructiveHint: true,
853
+ openWorldHint: true
854
+ },
823
855
  async handler(args, ctx) {
824
856
  const projectId = resolveProjectId(ctx, args.project_id);
825
857
  return json(
@@ -839,6 +871,12 @@ var toolDefinitions = [
839
871
  integration_id: import_zod.z.string(),
840
872
  ...projectIdArg
841
873
  },
874
+ annotations: {
875
+ title: "Retry Publish",
876
+ readOnlyHint: false,
877
+ destructiveHint: true,
878
+ openWorldHint: true
879
+ },
842
880
  async handler(args, ctx) {
843
881
  const projectId = resolveProjectId(ctx, args.project_id);
844
882
  return json(
@@ -858,7 +896,7 @@ var toolDefinitions = [
858
896
  limit: import_zod.z.number().int().min(1).max(200).optional(),
859
897
  ...projectIdArg
860
898
  },
861
- annotations: { readOnlyHint: true },
899
+ annotations: { title: "Publish Logs", readOnlyHint: true, destructiveHint: false },
862
900
  async handler(args, ctx) {
863
901
  const projectId = resolveProjectId(ctx, args.project_id);
864
902
  return json(
@@ -875,7 +913,7 @@ var toolDefinitions = [
875
913
  name: "list_keywords",
876
914
  description: "List tracked keywords for a project (search volume, difficulty, intent, status). Keywords drive topic relevance in generation.",
877
915
  inputSchema: { ...projectIdArg },
878
- annotations: { readOnlyHint: true },
916
+ annotations: { title: "List Keywords", readOnlyHint: true, destructiveHint: false },
879
917
  async handler(args, ctx) {
880
918
  return json(await ctx.client.listKeywords(resolveProjectId(ctx, args.project_id)));
881
919
  }
@@ -890,6 +928,7 @@ var toolDefinitions = [
890
928
  intent: import_zod.z.enum(["INFORMATIONAL", "NAVIGATIONAL", "TRANSACTIONAL", "COMMERCIAL"]).optional(),
891
929
  ...projectIdArg
892
930
  },
931
+ annotations: { title: "Add Keyword", readOnlyHint: false, destructiveHint: false },
893
932
  async handler(args, ctx) {
894
933
  const projectId = resolveProjectId(ctx, args.project_id);
895
934
  return json(
@@ -909,7 +948,7 @@ var toolDefinitions = [
909
948
  active_only: import_zod.z.boolean().optional().describe("Only active facts (default false = all)"),
910
949
  ...projectIdArg
911
950
  },
912
- annotations: { readOnlyHint: true },
951
+ annotations: { title: "List Product Facts", readOnlyHint: true, destructiveHint: false },
913
952
  async handler(args, ctx) {
914
953
  const projectId = resolveProjectId(ctx, args.project_id);
915
954
  return json(
@@ -927,6 +966,7 @@ var toolDefinitions = [
927
966
  active: import_zod.z.boolean().optional().describe("Set active flag when updating"),
928
967
  ...projectIdArg
929
968
  },
969
+ annotations: { title: "Supply Product Fact", readOnlyHint: false, destructiveHint: false },
930
970
  async handler(args, ctx) {
931
971
  const projectId = resolveProjectId(ctx, args.project_id);
932
972
  const category = Array.isArray(args.category) ? args.category.map(String) : void 0;
@@ -957,6 +997,12 @@ var toolDefinitions = [
957
997
  limit: import_zod.z.number().int().min(1).max(500).optional().describe("Max articles to export (default 100)"),
958
998
  ...projectIdArg
959
999
  },
1000
+ annotations: {
1001
+ title: "Export Blog to Files",
1002
+ readOnlyHint: false,
1003
+ destructiveHint: true,
1004
+ openWorldHint: true
1005
+ },
960
1006
  async handler(args, ctx) {
961
1007
  const projectId = resolveProjectId(ctx, args.project_id);
962
1008
  const status = typeof args.status === "string" ? args.status : "PUBLISHED";
@@ -993,10 +1039,12 @@ function buildServer(config) {
993
1039
  register(
994
1040
  tool.name,
995
1041
  {
996
- title: tool.name,
1042
+ // The human-readable title, not the wire name — a picker showing
1043
+ // "approve_publication" tells a person nothing about what it does.
1044
+ title: tool.annotations.title,
997
1045
  description: tool.description,
998
1046
  inputSchema: tool.inputSchema,
999
- ...tool.annotations ? { annotations: tool.annotations } : {}
1047
+ annotations: tool.annotations
1000
1048
  },
1001
1049
  async (args) => {
1002
1050
  let result;