get-membership-notes
Retrieve membership article lists from note.com using a membership key to access and browse published content with pagination support.
Instructions
メンバーシップの記事一覧を取得する
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| membershipKey | Yes | メンバーシップキー(例: fed4670a87bc) | |
| page | No | ページ番号 | |
| perPage | No | ページあたりの記事数 |
Implementation Reference
- src/tools/membership-tools.ts:144-206 (handler)Executes the tool logic: checks auth, fetches notes from `/v3/memberships/${membershipKey}/notes`, handles various response formats, formats notes and membership info, returns structured JSON.async ({ membershipKey, page, perPage }) => { try { if (!hasAuth()) { return createAuthErrorResponse(); } if (env.DEBUG) { console.error(`Getting membership notes for membershipKey: ${membershipKey}, page: ${page}, perPage: ${perPage}`); } const data = await noteApiRequest(`/v3/memberships/${membershipKey}/notes?page=${page}&per=${perPage}`, "GET", null, true); if (env.DEBUG) { console.error(`\n===== FULL Membership Notes API Response =====\n${JSON.stringify(data, null, 2)}`); } let formattedNotes: any[] = []; let totalCount = 0; let membershipInfo = {}; if (data.data) { // notesプロパティがある場合 if (data.data.notes && Array.isArray(data.data.notes)) { formattedNotes = data.data.notes.map(formatMembershipNote); totalCount = data.data.totalCount || data.data.total_count || data.data.total || formattedNotes.length; membershipInfo = data.data.membership || data.data.circle || {}; } // itemsプロパティがある場合 else if (data.data.items && Array.isArray(data.data.items)) { formattedNotes = data.data.items.map(formatMembershipNote); totalCount = data.data.totalCount || data.data.total_count || data.data.total || formattedNotes.length; membershipInfo = data.data.membership || data.data.circle || {}; } // 配列が直接返される場合 else if (Array.isArray(data.data)) { formattedNotes = data.data.map(formatMembershipNote); totalCount = formattedNotes.length; } } // メンバーシップ情報を整形 const formattedMembership = { id: (membershipInfo as any)?.id || "", key: (membershipInfo as any)?.key || membershipKey || "", name: (membershipInfo as any)?.name || "", description: (membershipInfo as any)?.description || "", creatorName: (membershipInfo as any)?.creator?.nickname || (membershipInfo as any)?.creatorName || "", price: (membershipInfo as any)?.price || 0, memberCount: (membershipInfo as any)?.memberCount || (membershipInfo as any)?.member_count || 0, notesCount: (membershipInfo as any)?.notesCount || (membershipInfo as any)?.notes_count || 0 }; return createSuccessResponse({ total: totalCount, page: page, perPage: perPage, membership: formattedMembership, notes: formattedNotes }); } catch (error) { return handleApiError(error, "メンバーシップ記事取得"); } }
- Zod schema defining input parameters: membershipKey (string), page (number, default 1), perPage (number, default 20).{ membershipKey: z.string().describe("メンバーシップキー(例: fed4670a87bc)"), page: z.number().default(1).describe("ページ番号"), perPage: z.number().default(20).describe("ページあたりの記事数"), },
- src/tools/membership-tools.ts:136-207 (registration)Registers the get-membership-notes tool with MCP server using server.tool(), including name, description, schema, and handler.server.tool( "get-membership-notes", "メンバーシップの記事一覧を取得する", { membershipKey: z.string().describe("メンバーシップキー(例: fed4670a87bc)"), page: z.number().default(1).describe("ページ番号"), perPage: z.number().default(20).describe("ページあたりの記事数"), }, async ({ membershipKey, page, perPage }) => { try { if (!hasAuth()) { return createAuthErrorResponse(); } if (env.DEBUG) { console.error(`Getting membership notes for membershipKey: ${membershipKey}, page: ${page}, perPage: ${perPage}`); } const data = await noteApiRequest(`/v3/memberships/${membershipKey}/notes?page=${page}&per=${perPage}`, "GET", null, true); if (env.DEBUG) { console.error(`\n===== FULL Membership Notes API Response =====\n${JSON.stringify(data, null, 2)}`); } let formattedNotes: any[] = []; let totalCount = 0; let membershipInfo = {}; if (data.data) { // notesプロパティがある場合 if (data.data.notes && Array.isArray(data.data.notes)) { formattedNotes = data.data.notes.map(formatMembershipNote); totalCount = data.data.totalCount || data.data.total_count || data.data.total || formattedNotes.length; membershipInfo = data.data.membership || data.data.circle || {}; } // itemsプロパティがある場合 else if (data.data.items && Array.isArray(data.data.items)) { formattedNotes = data.data.items.map(formatMembershipNote); totalCount = data.data.totalCount || data.data.total_count || data.data.total || formattedNotes.length; membershipInfo = data.data.membership || data.data.circle || {}; } // 配列が直接返される場合 else if (Array.isArray(data.data)) { formattedNotes = data.data.map(formatMembershipNote); totalCount = formattedNotes.length; } } // メンバーシップ情報を整形 const formattedMembership = { id: (membershipInfo as any)?.id || "", key: (membershipInfo as any)?.key || membershipKey || "", name: (membershipInfo as any)?.name || "", description: (membershipInfo as any)?.description || "", creatorName: (membershipInfo as any)?.creator?.nickname || (membershipInfo as any)?.creatorName || "", price: (membershipInfo as any)?.price || 0, memberCount: (membershipInfo as any)?.memberCount || (membershipInfo as any)?.member_count || 0, notesCount: (membershipInfo as any)?.notesCount || (membershipInfo as any)?.notes_count || 0 }; return createSuccessResponse({ total: totalCount, page: page, perPage: perPage, membership: formattedMembership, notes: formattedNotes }); } catch (error) { return handleApiError(error, "メンバーシップ記事取得"); } } );
- src/utils/formatters.ts:149-161 (helper)Helper function to format individual membership note objects for consistent output structure.export function formatMembershipNote(note: any): FormattedMembershipNote { return { id: note.id || "", title: note.name || note.title || "", excerpt: note.body ? (note.body.length > 100 ? note.body.substring(0, 100) + '...' : note.body) : '本文なし', publishedAt: note.publishAt || note.published_at || note.createdAt || note.created_at || '日付不明', likesCount: note.likeCount || note.likes_count || 0, commentsCount: note.commentsCount || note.comments_count || 0, user: note.user?.nickname || note.creator?.nickname || "", url: note.url || (note.user ? `https://note.com/${note.user.urlname}/n/${note.key || ''}` : ''), isMembersOnly: note.is_members_only || note.isMembersOnly || true }; }
- src/tools/index.ts:17-17 (registration)Top-level registration call within registerAllTools that invokes membership tools registration.registerMembershipTools(server);