Access and search messages across all your messaging platforms (WhatsApp, Telegram, Discord, Slack, etc.) through Beeper Desktop
A minimal template for creating OpenCode plugins. Copy this folder and customize it to build your own plugin.
``bash`From pets directory
cp -r _TEMPLATE_ my-plugin
cd my-plugin
Edit these files:
package.json:
- Change name to openpets/my-plugindescription
- Update envVariables
- Add your environment variables in queries
- Add example queries in
index.ts:
- Rename TemplatePlugin to MyPlugintools
- Add your tools to the arrayexecute
- Implement your logic in the functions
opencode.json:
- Update if needed (usually no changes required)
`bash`
npm install
npm run quickstart
`typescript
export const MyPlugin = async () => {
const tools: ToolDefinition[] = [
{
name: "my-tool",
description: "What this tool does",
schema: z.object({
param: z.string().describe("Parameter description")
}),
execute: async (args) => {
// Your logic here
return JSON.stringify({
success: true,
data: "result"
})
}
}
]
return createPlugin(tools)
}
`
Just add more tool definitions to the array:
`typescript`
const tools: ToolDefinition[] = [
{
name: "tool-one",
description: "First tool",
schema: z.object({ / ... / }),
execute: async (args) => { / ... / }
},
{
name: "tool-two",
description: "Second tool",
schema: z.object({ / ... / }),
execute: async (args) => { / ... / }
}
]
Import utilities from @/utils/:
`typescript
// Example: Using Google Maps
const { GoogleMapsAPI } = await import("@/utils/google-maps")
const maps = new GoogleMapsAPI({ apiKey: process.env.GOOGLE_MAPS_API_KEY })
const result = await maps.geocode("New York")
// Example: Using FAL AI
const { createFalClient } = await import("@/utils/fal")
const fal = createFalClient()
`
Add to package.json:
`json`
{
"envVariables": {
"required": [
{
"name": "MY_API_KEY",
"description": "API key for my service",
"provider": "My Service",
"priority": 1
}
],
"optional": [
{
"name": "MY_CONFIG",
"description": "Optional configuration",
"provider": "Configuration",
"priority": 2
}
]
}
}
Access in code:
`typescript`
const apiKey = process.env.MY_API_KEY
Define your parameters with type safety:
`typescript
schema: z.object({
// String
name: z.string().describe("User name"),
// Optional string with default
greeting: z.string().optional().default("Hello").describe("Greeting"),
// Number
age: z.number().describe("User age"),
// Enum
type: z.enum(["user", "admin"]).describe("User type"),
// Boolean
active: z.boolean().describe("Is active"),
// Array
tags: z.array(z.string()).describe("Tags list")
})
`
Always return JSON string:
`typescript
// Success
return JSON.stringify({
success: true,
data: yourData,
message: "Operation completed"
})
// Error
return JSON.stringify({
success: false,
error: "Error message"
})
`
You now have everything you need to build your own plugin. Keep it simple and add complexity as needed.
For more examples, check out other plugins in the pets/` directory.