{"formatVersion":"1","kind":"dock_integration","slug":"discord-bot-api","title":"Discord Bot API","summary":"Import a Harbor-safe Discord bot starter set for guild listing, channel discovery, and approval-friendly message posting.","description":"A Dock-hosted Discord Bot API starter integration for Harbor. Importing it creates a local http_api port shell plus a Harbor-safe Discord action set using Harbor's Action Model for explicit guild and channel identifiers.","version":"0.1.0","publisher":{"slug":"discord","name":"Discord","websiteUrl":"https://docs.discord.com/developers"},"category":"Messaging","tags":["discord","bot","chat","guilds","messaging"],"compatibility":{"harborNode":">=0.1.0","notes":"Requires local operator-configured auth after import. Templates use location-based inputs such as input.path, input.query, and input.body at execution time."},"requiredPlan":"community","portTemplates":[{"kind":"http_api","label":"Discord Bot API","description":"Discord Bot API connection managed locally through Harbor.","baseUrl":"https://discord.com/api/v10/","authMode":"header_token","authHeaderName":"Authorization","authTokenPrefix":"Bot"}],"actionTemplates":[{"slug":"list-guilds","label":"List Guilds","description":"List guilds visible to the current Discord identity with typed pagination inputs.","method":"GET","path":"/users/@me/guilds","inputs":{"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200},"default":100,"description":"Maximum number of guilds to return."},{"name":"before","in":"query","schema":{"type":"string"},"description":"Guild snowflake to paginate backward from."},{"name":"after","in":"query","schema":{"type":"string"},"description":"Guild snowflake to paginate forward from."},{"name":"with_counts","in":"query","schema":{"type":"boolean"},"description":"Whether to include approximate member and presence counts."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"list-channels","label":"List Guild Channels","description":"List channels for a specific Discord guild using an explicit guild identifier.","method":"GET","path":"/guilds/{guildId}/channels","inputs":{"parameters":[{"name":"guildId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Discord guild snowflake whose channels should be listed."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"get-channel","label":"Get Channel","description":"Fetch a Discord channel using an explicit channel identifier.","method":"GET","path":"/channels/{channelId}","inputs":{"parameters":[{"name":"channelId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Discord channel snowflake."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"list-channel-messages","label":"List Channel Messages","description":"List messages in a Discord channel using an explicit channel identifier and typed pagination inputs.","method":"GET","path":"/channels/{channelId}/messages","inputs":{"parameters":[{"name":"channelId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Discord channel snowflake."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"default":50,"description":"Maximum number of messages to return."},{"name":"before","in":"query","schema":{"type":"string"},"description":"Message snowflake to paginate backward from."},{"name":"after","in":"query","schema":{"type":"string"},"description":"Message snowflake to paginate forward from."},{"name":"around","in":"query","schema":{"type":"string"},"description":"Message snowflake around which to center results."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"get-message","label":"Get Message","description":"Fetch a Discord message using explicit channel and message identifiers.","method":"GET","path":"/channels/{channelId}/messages/{messageId}","inputs":{"parameters":[{"name":"channelId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Discord channel snowflake."},{"name":"messageId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Discord message snowflake."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"create-message","label":"Create Message","description":"Post a message to a Discord channel using an explicit channel identifier and a bounded JSON request body.","method":"POST","path":"/channels/{channelId}/messages","inputs":{"parameters":[{"name":"channelId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Discord channel snowflake that will receive the message."}]},"approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"delete-message","label":"Delete Message","description":"Delete a Discord message using explicit channel and message identifiers.","method":"DELETE","path":"/channels/{channelId}/messages/{messageId}","inputs":{"parameters":[{"name":"channelId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Discord channel snowflake."},{"name":"messageId","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Discord message snowflake."}]},"approvalMode":"require_approval","requestBodyMode":"none","resultMode":"json_summary"}],"workflowTemplates":[{"slug":"guild-channel-post-check","title":"Guild Channel Post Check","summary":"Future workflow template for inspecting guilds, narrowing to a channel, and drafting an operator-reviewed message post."}],"helpText":"Import to Harbor, configure local auth, then use the starter Discord actions with explicit guild and channel identifiers. Keep create-message on approval unless your local policy explicitly allows operator-reviewed sends.","installNotes":"Dock shares only safe metadata. Hidden auth must be configured locally inside Harbor after import. Discord actions use input.path for guild and channel identifiers, input.query for pagination values, and input.body for the message creation payload."}