API
The JSON API provides read-only access to community data without authentication and supports cross-origin requests.
Base URL
Endpoints
| Endpoint | Description |
|---|---|
/api/companies | List companies |
/api/companies/:slug | Get company |
/api/events | List events |
/api/events/:slug | Get event |
/api/groups | List groups |
/api/groups/:slug | Get group |
/api/jobs | List jobs |
/api/jobs/:slug | Get job |
/api/education | List education |
/api/education/:slug | Get education |
/api/news | List news |
/api/news/:slug | Get news article |
/api/people | List people |
/api/people/:slug | Get person |
/api/projects | List projects |
/api/projects/:slug | Get project |
/api/products | List products |
/api/products/:slug | Get product |
/api/technologies | List technologies |
/api/technologies/:slug | Get technology |
Pagination
List endpoints support pagination:
limit- Number of items (default: 20, max: 100)offset- Items to skip (default: 0)
Responses include a pagination object:
{
"data": [...],
"pagination": {
"total": 42,
"limit": 20,
"offset": 0,
"hasMore": true
}
}Responses also include RFC 5988 Link headers for navigation:
Link: <https://siliconharbour.dev/api/companies?limit=20&offset=20>; rel="next",
<https://siliconharbour.dev/api/companies?limit=20&offset=0>; rel="first"
OpenAPI specification
MCP server
AI assistants and agents can connect to the MCP (Model Context Protocol) server at /mcp.
Endpoint: https://siliconharbour.dev/mcp
Tools
The server has two public tools and one authenticated tool. Expand a tool to see its available functions. This list comes from the bridge implementation and stays in sync with the server.
searchPublicexpand
Search the SiliconHarbour API schema to discover available entities and field shapes. Call this first to learn what data exists, then use query or execute to fetch it.
queryPublic8 functionsexpand
Execute restricted JavaScript in Code Mode to read SiliconHarbour data. Functions below are available through tools.siliconharbour. Each call hits the real database on-demand. Timeout: 10 seconds.
tools.siliconharbour.companies({ query?, limit?, offset? })tools.siliconharbour.education({ limit?, offset? })tools.siliconharbour.events({ upcoming?, limit?, offset?, query? })tools.siliconharbour.groups({ limit?, offset? })tools.siliconharbour.jobs({ query?, limit?, offset?, companyId?, sourceId?, status?, isTechnical?, workplaceType?, location?, lastSeenAfter? })tools.siliconharbour.news({ query?, limit?, offset? })tools.siliconharbour.people({ query?, limit?, offset? })tools.siliconharbour.technologies({ limit?, offset? })executeAuthenticated30 functionsexpand
Like query, but also exposes sync, creation, review, and lifecycle functions. Requires an OAuth-authorized MCP session with the mcp:write scope. Timeout: 60 seconds.
tools.siliconharbour.companies({ query?, limit?, offset? })tools.siliconharbour.education({ limit?, offset? })tools.siliconharbour.events({ upcoming?, limit?, offset?, query? })tools.siliconharbour.groups({ limit?, offset? })tools.siliconharbour.jobs({ query?, limit?, offset?, companyId?, sourceId?, status?, isTechnical?, workplaceType?, location?, lastSeenAfter? })tools.siliconharbour.news({ query?, limit?, offset? })tools.siliconharbour.people({ query?, limit?, offset? })tools.siliconharbour.technologies({ limit?, offset? })tools.siliconharbour.eventImportSources({})tools.siliconharbour.jobImportSources({})tools.siliconharbour.listImporterTypes({})tools.siliconharbour.newsImportSources({})tools.siliconharbour.syncAllSources({ type? }) where type is 'event'|'job'|'news' (omit to sync all)tools.siliconharbour.syncSource({ type, sourceId }) where type is 'event'|'job'|'news'tools.siliconharbour.asyncSyncAllSources({ type? }) where type is 'event'|'job'|'news' (omit to sync all)tools.siliconharbour.getAsyncSync({ runId })tools.siliconharbour.listAsyncSyncs({})tools.siliconharbour.createEntity({ type, ...fields })tools.siliconharbour.deleteEntity({ type, id })tools.siliconharbour.deleteEventTag({ id })tools.siliconharbour.saveEventTag({ id?, name, color })tools.siliconharbour.updateEntity({ type, id, ...fields })tools.siliconharbour.eventTags({})tools.siliconharbour.getEntity({ type, by, value }) where by is 'id'|'slug'|'name'tools.siliconharbour.listEntities({ type, filter? }) where filter is 'manual'|'pending'|'all'tools.siliconharbour.getTechNLJob({ link })tools.siliconharbour.listTechNLJobs({})tools.siliconharbour.searchIndeedJobs({ query?, location?, limit?, hoursOld? })tools.siliconharbour.searchLinkedInJobs({ query?, location?, limit? })tools.siliconharbour.reviewEntity({ type, id, action })Connect an MCP client
Add the endpoint to any client that supports remote MCP servers:
{
"mcpServers": {
"siliconharbour": {
"url": "https://siliconharbour.dev/mcp"
}
}
}You can use search and query without signing in. These tools provide read-only access to public SiliconHarbour data.
OAuth is optional. To use the execute tool, start your MCP client's sign-in action and log in with your SiliconHarbour account. The client discovers the OAuth endpoints automatically and opens the site's login and consent flow. You do not need an API key or shared secret.
The execute tool requires the mcp:write OAuth scope and an administrator account. It can run imports, create or update records, and perform review actions. An invalid or expired OAuth session is rejected instead of falling back to public access.
Programs run in Code Mode, a restricted JavaScript interpreter. Call functions through tools.siliconharbour with one input object ({} when no parameters are needed), then return the result. Imports and module exports are unavailable. Use await for every started call, and Promise.all for independent calls.
Inside a program, search({ query: "company" }) discovers tool signatures. The separate MCP search tool also provides entity field details.
Responses contain ok, value or error, toolCalls, and optional logs, warnings, and truncated. Queries have a 10-second timeout; authenticated actions have 60 seconds. Both allow at most 100 tool calls and retain up to 64 KiB of result and logs. Narrow results or paginate when output is truncated. A failed execution can have completed earlier writes; inspect toolCalls before retrying. Timeouts do not undo writes or cancel existing database/import operations.
Example queries
// Upcoming events
return await tools.siliconharbour.events({ upcoming: true, limit: 5 });// Jobs filtered by keyword
return await tools.siliconharbour.jobs({ query: "developer", limit: 10 });// Cross-entity query
const [upcoming, cos, grps] = await Promise.all([
tools.siliconharbour.events({ upcoming: true }),
tools.siliconharbour.companies({ limit: 5 }),
tools.siliconharbour.groups({ limit: 5 }),
]);
return {
upcoming: upcoming.length,
companies: cos.map((c) => c.name),
groups: grps.map((g) => g.name),
};Feeds
RSS feeds and an iCal calendar are also available. See Stay Connected for details.
/feed.rss- Combined RSS feed/events.rss- Events RSS feed/news.rss- News RSS feed/jobs.rss- Jobs RSS feed/calendar.ics- iCal calendar subscription