0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

X記事を通常投稿MCPに混ぜない設計:下書き・サムネ確認・公開URL確認を別adapterに分ける

0
Posted at

X記事adapterの公開ゲート - 下書き、サムネ確認、公開URL確認を通常投稿MCPから分離する

X記事公開フロー - draft、thumbnail review、publish confirmation、URL verification

はじめに

Xの通常投稿とX記事は、どちらも「Xへ出すコンテンツ」です。しかしAIエージェントに任せる実装としては、同じツールに混ぜない方が安全です。

通常投稿は短文、画像、予約、投稿結果URLの確認が中心です。一方でX記事は、本文が長く、サムネイルがあり、エディタ画面での見え方が重要で、公開後URLの確認も必要です。

Agent Memoriesでは、X記事を通常投稿MCPの延長で「実装済み」と言い切らず、別adapterまたはSOPとして扱います。この記事では、その理由と最低限のゲートを整理します。

通常投稿MCPに混ぜると何が起きるか

通常投稿MCPは、次のような入力で成立します。

type XPostInput = {
  text: string;
  imagePaths?: string[];
  dryRun?: boolean;
};

この形は短文投稿には向いています。しかしX記事では足りません。

  • タイトルと本文の分離
  • サムネイルの表示確認
  • 下書き保存と公開の分離
  • 公開直前の最終確認
  • 公開URLの取得と台帳記録

これらを textimagePaths に押し込むと、実装は簡単に見えますが、事故時にどの段階で止めるべきか分かりにくくなります。

adapterを分ける

X記事用adapterでは、入力を記事として扱います。

type XArticleDraftInput = {
  slug: string;
  title: string;
  bodyMarkdown: string;
  coverImagePath: string;
  routeId: "agent_memories_official";
  account: "@agent_memories";
  dryRun: true;
};

重要なのは dryRun: true を既定にすることです。最初の呼び出しで公開まで進めず、まず下書き生成とチェック項目を返します。

type XArticleDraftResult = {
  ok: true;
  draftId?: string;
  checks: {
    titlePresent: boolean;
    coverPresent: boolean;
    bodyLength: number;
    secretLeakScan: "pass" | "fail";
  };
  nextStep: "review_thumbnail" | "fix_required";
};

ゲート1: 下書き保存

記事はまず下書きに保存します。下書き保存の成功は、公開成功ではありません。

async function createDraft(input: XArticleDraftInput): Promise<XArticleDraftResult> {
  const checks = validateArticleInput(input);
  if (checks.secretLeakScan === "fail") {
    return { ok: true, checks, nextStep: "fix_required" };
  }

  if (input.dryRun) {
    return { ok: true, checks, nextStep: "review_thumbnail" };
  }

  throw new Error("Live draft creation requires an explicit publish session");
}

この段階では、外部公開をしません。プレビュー、入力検証、secret露出チェックまでに留めます。

ゲート2: サムネイル確認

X記事は、サムネイルが崩れると読まれません。記事本文が正しくても、タイトルが切れていたり、画像が古かったりすると、発信としては失敗です。

そのため、adapterはサムネイル確認を独立した状態として扱います。

type ReviewState =
  | "draft_created"
  | "thumbnail_reviewed"
  | "ready_to_publish"
  | "published";

人間またはQC担当がスクリーンショットを確認し、thumbnail_reviewed へ進めるまで、公開関数は実行できないようにします。

ゲート3: 公開URL確認

公開後はURLを取得して台帳に残します。ここを省くと、出したつもりの記事が見つからないままになります。

type PublishedArticle = {
  slug: string;
  platform: "x_article";
  account: "@agent_memories";
  url: string;
  publishedAt: string;
};

公開処理は「送信成功」では終わらせません。公開URLをブラウザで開き、本文、サムネイル、アカウントが一致していることまで確認します。

通常投稿とX記事の境界

通常投稿MCPは、短文投稿、画像投稿、like、repost、bookmarkのような小さな操作に向いています。X記事adapterは、長文コンテンツの下書き、レビュー、公開確認に向いています。

同じXでも、責務を分けると事故の種類が減ります。

  • 通常投稿: 速く、小さく、dry-run中心
  • X記事: 下書き、確認、公開URL台帳

まとめ

X記事は、通常投稿MCPに混ぜず、別adapterとして扱う方が安全です。

最低限のゲートは次の3つです。

  1. 下書き保存で止める
  2. サムネイル確認を独立させる
  3. 公開URLを取得して台帳に残す

AIパートナーが記事化まで手伝えるようになるほど、公開前の状態管理が重要になります。Agent Memoriesでは、便利さより先に「どこで止まるか」を設計します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?