get-membership-notes
Retrieve articles from a note.com membership by providing the membership key, with options to paginate results for efficient browsing.
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 core logic of fetching membership notes from the Note API, handling pagination, formatting notes and membership info using formatMembershipNote, and structuring the response.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 (required 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 on the MCP server with name, Japanese description, input schema, and inline handler function.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, "メンバーシップ記事取得"); } } );