Pre-built clients for common services. Select them during /new-tool or add them manually.
lib/integrations/gitlab.tsRead repositories, branches, merge requests, CI/CD pipelines, and issues. Authenticated with a personal access token.
Use cases
Environment variables
GITLAB_URLGITLAB_TOKEN// GITLAB_URL=https://gitlab.com
// GITLAB_TOKEN=glpat-...
import { gitlabClient } from '@/lib/integrations/gitlab'
const mrs = await gitlabClient.mergeRequests.list({ projectId: 42, state: 'opened' })
const file = await gitlabClient.files.get({ projectId: 42, path: 'README.md', ref: 'main' })lib/integrations/slack.tsSend messages to channels or users using a bot token, or post to a webhook URL.
Use cases
Environment variables
SLACK_BOT_TOKENSLACK_WEBHOOK_URL// SLACK_BOT_TOKEN=xoxb-...
// SLACK_WEBHOOK_URL=https://hooks.slack.com/...
import { slackClient } from '@/lib/integrations/slack'
await slackClient.postMessage({ channel: '#deployments', text: '✅ Deploy complete' })
await slackClient.postWebhook({ text: 'New submission received' })lib/integrations/atlassian.tsRead and write Jira issues and Confluence pages. Authenticated with email + API token (basic auth).
Use cases
Environment variables
ATLASSIAN_BASE_URLATLASSIAN_EMAILATLASSIAN_API_TOKEN// ATLASSIAN_BASE_URL=https://yourorg.atlassian.net
// ATLASSIAN_EMAIL=you@example.com
// ATLASSIAN_API_TOKEN=...
import { atlassianClient } from '@/lib/integrations/atlassian'
const issue = await atlassianClient.jira.createIssue({ summary: 'Bug report', type: 'Bug' })
const page = await atlassianClient.confluence.getPage({ pageId: '123456' })lib/integrations/personio.tsRead employee data, attendance, and absences from Personio HR. Authenticated with OAuth2 client credentials.
Use cases
Environment variables
PERSONIO_CLIENT_IDPERSONIO_CLIENT_SECRET// PERSONIO_CLIENT_ID=...
// PERSONIO_CLIENT_SECRET=...
import { personioClient } from '@/lib/integrations/personio'
const employees = await personioClient.employees.list()
const absences = await personioClient.absences.list({ startDate: '2024-01-01' })lib/integrations/simplicate.tsRead employees, projects, hours, and CRM data from Simplicate. Authenticated with API key + secret (HMAC header auth).
Use cases
Environment variables
SIMPLICATE_SUBDOMAINSIMPLICATE_API_KEYSIMPLICATE_API_SECRET// SIMPLICATE_SUBDOMAIN=yourorg (from yourorg.simplicate.nl)
// SIMPLICATE_API_KEY=...
// SIMPLICATE_API_SECRET=...
import { simplicateClient } from '@/lib/integrations/simplicate'
const projects = await simplicateClient.projects.list()
const hours = await simplicateClient.hours.list({ projectId: 'p:abc123' })lib/integrations/<name>.tsAdd any API not listed above. The /new-tool questionnaire will ask you to describe it; the AI scaffolds a typed client stub.
Use cases
Environment variables
CUSTOM_API_BASE_URLCUSTOM_API_KEY// lib/integrations/myservice.ts
const BASE_URL = process.env.MYSERVICE_BASE_URL ?? ''
const API_KEY = process.env.MYSERVICE_API_KEY ?? ''
async function request<T>(path: string, options?: RequestInit): Promise<T> {
const res = await fetch(`${BASE_URL}${path}`, {
...options,
headers: { Authorization: `Bearer ${API_KEY}`, 'Content-Type': 'application/json', ...options?.headers },
})
if (!res.ok) throw new Error(`[MyService] ${res.status} ${res.statusText}`)
return res.json()
}
export const myServiceClient = {
items: { list: () => request<Item[]>('/items') },
}