Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
93d2171
improvement(mcp): prepare the hosted MCP server for registry and plug…
waleedlatif1 Oct 17, 2026
af8284b
docs(library): update best-conversational-ai-platforms-crm-helpdesk (…
waleedlatif1 Oct 18, 2026
7be602f
docs(library): update ai-agent-examples-by-department-and-industry (#…
waleedlatif1 Oct 18, 2026
453b708
docs(library): update agentic-ai-coding-tools-what-they-are-and-how-t…
waleedlatif1 Oct 18, 2026
33c3063
feat(library): How Do AI Agents Use Tools and APIs? (#9190)
waleedlatif1 Oct 18, 2026
3aad201
feat(library): 6 Best AWS Bedrock Agents and Vertex AI Agent Builder …
waleedlatif1 Oct 18, 2026
4346f70
fix(providers): refuse an empty Responses input before sending instea…
waleedlatif1 Oct 18, 2026
246ff83
fix(streaming): stop writing workflow stream frames after the client …
waleedlatif1 Oct 18, 2026
bd8dd00
fix(account-deletion): list storage keys through the S3 client so Tri…
waleedlatif1 Oct 18, 2026
124a319
fix(mcp): route deferred transport requests under the client's outbou…
waleedlatif1 Oct 18, 2026
109bd82
fix(media): send ElevenLabs TTS text under the field fal requires (#9…
waleedlatif1 Oct 18, 2026
768141a
fix(copilot): read sandbox paths in files view and admit missing over…
waleedlatif1 Oct 18, 2026
c1c0843
improvement(landing): search-length titles, model comparison pages, a…
waleedlatif1 Oct 18, 2026
4c02fa1
fix(custom-tools): skip title conflicts when persisting inline tools …
waleedlatif1 Oct 18, 2026
8c30945
feat(cloudflare): expand API coverage and validate operations (#9194)
waleedlatif1 Oct 18, 2026
2d5b698
docs(library): update best-zapier-alternatives (#9201)
waleedlatif1 Oct 18, 2026
9ef474c
fix(memory): read memory records and their provenance in one statemen…
waleedlatif1 Oct 18, 2026
9cdc1bd
fix(landing): correct model version names, fit model page titles, and…
waleedlatif1 Oct 18, 2026
cc6e91f
feat(greenhouse): add versioned Harvest v3 integration (#9206)
waleedlatif1 Oct 18, 2026
282d952
improvement(db): name chat uploads in one indexed read and index work…
waleedlatif1 Oct 18, 2026
9f7b00d
fix(file): bind copied workspace files to their source by storage key…
waleedlatif1 Oct 18, 2026
da5d059
fix(api): answer upstream MCP, OAuth, and id-conflict failures with 4…
waleedlatif1 Oct 18, 2026
9324ef3
feat(excel): expand workbook operations and align Graph contracts (#9…
waleedlatif1 Oct 19, 2026
bd44d7b
fix(execution): classify SDK run aborts and refuse doomed provider an…
waleedlatif1 Oct 19, 2026
5187677
feat(zoho-desk): expand help desk operations (#9205)
waleedlatif1 Oct 19, 2026
9f8b03d
fix(greenhouse): align configured agent inputs with API parameters (#…
waleedlatif1 Oct 19, 2026
c0cf608
fix(billing): stop free-plan workflow runs at their usage limit mid-r…
waleedlatif1 Oct 19, 2026
799008b
feat(greenhouse): connect Harvest v3 with a customer-owned API creden…
waleedlatif1 Oct 19, 2026
781cedb
docs(library): update best-ai-agent-platforms-for-enterprise-teams-20…
waleedlatif1 Oct 19, 2026
82a4981
feat(library): LLMs vs AI Agents: What Is the Difference? (#9217)
waleedlatif1 Oct 19, 2026
1b74202
docs(library): update n8n-alternatives (#9219)
waleedlatif1 Oct 19, 2026
f874666
docs(library): update best-conversational-ai-platforms-crm-helpdesk (…
waleedlatif1 Oct 19, 2026
6bec12d
feat(library): How Do You Connect a Google Drive MCP Server to an AI …
waleedlatif1 Oct 19, 2026
1f0dd8a
fix(library): point cross-links at the renamed 15 Best Zapier Alterna…
waleedlatif1 Oct 19, 2026
63afac4
fix(cloudflare): require explicit R2 lifecycle replacement rules (#9225)
waleedlatif1 Oct 19, 2026
5c93e8f
improvement(async-jobs): warn when Trigger.dev run acceptance is slow…
waleedlatif1 Oct 19, 2026
91cb0b0
fix(execution): precheck the default video target and attribute 4xx r…
waleedlatif1 Oct 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
14 changes: 14 additions & 0 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"name": "sim",
"description": "Plugins for Sim, the open-source AI workspace.",
"owner": {
"name": "Sim",
"url": "https://www.sim.ai"
},
"plugins": [
{
"name": "sim",
"source": "./plugins/sim"
}
]
}
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,16 @@ macOS 12+, Apple Silicon and Intel. See the [desktop docs](https://docs.sim.ai/d
</tr>
</table>

## MCP server

Connect Claude, Claude Code, Codex, or any MCP client to Sim Cloud at `https://mcp.sim.ai/mcp`. Your agent can manage workspaces, run and deploy workflows, and work with tables, knowledge bases, files, and logs. Sign in with OAuth or use an API key.

- **Claude Code:** `claude mcp add --transport http sim https://mcp.sim.ai/mcp`, then open `/mcp` to sign in
- **Claude:** add `https://mcp.sim.ai/mcp` as a custom connector under **Customize → Connectors**
- **Codex:** `codex mcp add sim --url https://mcp.sim.ai/mcp`

See the [MCP docs](https://docs.sim.ai/mcp/overview) for other clients and for self-hosted URLs.

## Self-hosting

**Requirements:** [Node.js 20+](https://nodejs.org/) and [Docker](https://www.docker.com/).
Expand Down
1 change: 1 addition & 0 deletions apps/docs/components/ui/icon-mapping.ts
Original file line number Diff line number Diff line change
Expand Up @@ -463,6 +463,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
grain_v2: GrainIcon,
granola: GranolaIcon,
greenhouse: GreenhouseIcon,
greenhouse_v2: GreenhouseIcon,
greptile: GreptileIcon,
guardrails: ShieldCheckIcon,
harmonic: HarmonicIcon,
Expand Down
9,257 changes: 8,163 additions & 1,094 deletions apps/docs/content/docs/integrations/cloudflare.mdx

Large diffs are not rendered by default.

2,093 changes: 1,775 additions & 318 deletions apps/docs/content/docs/integrations/greenhouse.mdx

Large diffs are not rendered by default.

507 changes: 485 additions & 22 deletions apps/docs/content/docs/integrations/microsoft_excel.mdx

Large diffs are not rendered by default.

29 changes: 1 addition & 28 deletions apps/docs/content/docs/integrations/sendgrid.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -325,34 +325,7 @@ Delete an email template from SendGrid

#### Output

| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `success` | boolean | Operation success status |
| `message` | string | Status or success message |
| `messageId` | string | Email message ID \(send_mail\) |
| `to` | string | Recipient email address \(send_mail\) |
| `subject` | string | Email subject \(send_mail, create_template_version\) |
| `id` | string | Resource ID |
| `jobId` | string | Job ID for async operations |
| `email` | string | Contact email address |
| `firstName` | string | Contact first name |
| `lastName` | string | Contact last name |
| `createdAt` | string | Creation timestamp |
| `updatedAt` | string | Last update timestamp |
| `listIds` | json | Array of list IDs the contact belongs to |
| `customFields` | json | Custom field values |
| `contacts` | json | Array of contacts |
| `contactCount` | number | Number of contacts |
| `lists` | json | Array of lists |
| `name` | string | Resource name |
| `templates` | json | Array of templates |
| `generation` | string | Template generation |
| `versions` | json | Array of template versions |
| `nextPageToken` | string | Token for the next page of results \(list_all_lists, list_templates\) |
| `templateId` | string | Template ID |
| `active` | boolean | Whether template version is active |
| `htmlContent` | string | HTML content |
| `plainContent` | string | Plain text content |
No output fields.

### SendGrid Create Template Version

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,16 @@ Sim requests the Zoho Desk scopes used by its tools, knowledge connector, organi

```
Desk.tickets.READ
Desk.tickets.CREATE
Desk.tickets.UPDATE
Desk.contacts.READ
Desk.contacts.CREATE
Desk.contacts.UPDATE
Desk.accounts.READ
Desk.accounts.CREATE
Desk.accounts.UPDATE
Desk.search.READ
Desk.departments.READ
Desk.agents.READ
Desk.basic.READ
Desk.articles.READ
Expand Down
832 changes: 827 additions & 5 deletions apps/docs/content/docs/integrations/zoho_desk.mdx

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions apps/docs/openapi-v2-resources.json
Original file line number Diff line number Diff line change
Expand Up @@ -17530,6 +17530,7 @@
"providerId": {
"type": "string",
"enum": [
"greenhouse",
"github-repositories",
"google-email",
"google-drive",
Expand Down
46 changes: 30 additions & 16 deletions apps/sim/app/(landing)/models/(shell)/[provider]/[model]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import { JsonLd } from '@/app/(landing)/components/json-ld'
import { LandingFAQ } from '@/app/(landing)/components/landing-faq'
import { LANDING_CONTENT_WIDTH, LANDING_GUTTER } from '@/app/(landing)/components/landing-layout'
import { ShareButton } from '@/app/(landing)/components/share-button'
import { getModelComparisonsFor } from '@/app/(landing)/models/comparisons'
import { ComparisonLinks } from '@/app/(landing)/models/components/comparison-links'
import { FeaturedModelCard, ProviderIcon } from '@/app/(landing)/models/components/model-primitives'
import {
buildModelCapabilityFacts,
Expand All @@ -17,6 +19,9 @@ import {
formatUpdatedAt,
getEffectiveMaxOutputTokens,
getModelBySlug,
getModelPageDescription,
getModelPageName,
getModelPageTitle,
getPricingBounds,
getProviderBySlug,
getRelatedModels,
Expand All @@ -38,14 +43,6 @@ export async function generateStaticParams() {
)
}

/**
* Model name qualified by its reseller ("Claude Opus 4.7 on AWS Bedrock"), so a reseller's page is
* distinguishable from the first-party page for the same model in titles and the H1.
*/
function hostedModelName(provider: { name: string; isReseller: boolean }, displayName: string) {
return provider.isReseller ? `${displayName} on ${provider.name}` : displayName
}

export async function generateMetadata({
params,
}: {
Expand All @@ -59,11 +56,12 @@ export async function generateMetadata({
return {}
}

const pageName = hostedModelName(provider, model.displayName)
const title = getModelPageTitle(provider, model)
const description = getModelPageDescription(provider, model)

return {
title: `${pageName} Pricing, Context Window, and Features`,
description: `${model.displayName} by ${provider.name}: pricing, cached input cost, output cost, context window, and capability support. Explore the full generated model page on Sim.`,
title,
description,
keywords: [
model.displayName,
`${model.displayName} pricing`,
Expand All @@ -76,14 +74,14 @@ export async function generateMetadata({
// og:image/twitter:image come from the sibling opengraph-image.tsx -
// Next serves it at a hash-suffixed URL, so hardcoding it here 404s.
openGraph: {
title: `${pageName} Pricing, Context Window, and Features | Sim`,
description: `${model.displayName} by ${provider.name}: pricing, context window, and model capability details.`,
title: `${title} | Sim`,
description,
url: `${baseUrl}${model.href}`,
type: 'website',
},
twitter: {
card: 'summary_large_image',
title: `${pageName} | Sim`,
title: `${title} | Sim`,
description: model.summary,
},
alternates: {
Expand All @@ -109,6 +107,7 @@ export default async function ModelPage({
const capabilityFacts = buildModelCapabilityFacts(model)
const pricingBounds = getPricingBounds(model.pricing)
const relatedModels = getRelatedModels(model, 6)
const comparisons = getModelComparisonsFor(model)

const breadcrumbJsonLd = {
'@context': 'https://schema.org',
Expand Down Expand Up @@ -181,7 +180,7 @@ export default async function ModelPage({
id='model-heading'
className='text-[28px] text-[var(--text-primary)] leading-[100%] tracking-[-0.02em] sm:text-[36px] lg:text-[44px]'
>
{hostedModelName(provider, model.displayName)}
{getModelPageName(provider, model)}
</h1>
</div>
</div>
Expand All @@ -195,7 +194,7 @@ export default async function ModelPage({
<ChipLink variant='primary' href='/'>
Build with this model
</ChipLink>
<ChipLink href={provider.href} className='border border-[var(--border-1)]'>
<ChipLink href={provider.href} variant='outline'>
All {provider.name} models
</ChipLink>
<ShareButton url={`${baseUrl}${model.href}`} title={model.displayName} />
Expand Down Expand Up @@ -273,6 +272,21 @@ export default async function ModelPage({
</>
)}

{comparisons.length > 0 && (
<>
<div className='h-px w-full bg-[var(--border)]' />
<nav aria-labelledby='model-comparisons-heading' className='px-6 py-10'>
<h2
id='model-comparisons-heading'
className='mb-6 text-[24px] text-[var(--text-primary)] leading-[100%] tracking-[-0.02em] max-lg:text-[20px]'
>
Compare {model.displayName}
</h2>
<ComparisonLinks comparisons={comparisons} />
</nav>
</>
)}

<div className='h-px w-full bg-[var(--border)]' />

<section aria-labelledby='model-faq-heading' className='px-6 py-10'>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import { notFound } from 'next/navigation'
import { COVER_OG_SIZE, createCoverOgImage } from '@/lib/og/cover-image'
import { getProviderBySlug, MODEL_PROVIDERS_WITH_CATALOGS } from '@/app/(landing)/models/utils'
import {
getProviderBySlug,
getProviderPageTitle,
MODEL_PROVIDERS_WITH_CATALOGS,
} from '@/app/(landing)/models/utils'

export const contentType = 'image/png'
export const size = COVER_OG_SIZE
Expand All @@ -21,7 +25,7 @@ export default async function Image({ params }: { params: Promise<{ provider: st
}

return createCoverOgImage({
title: `${provider.name} models`,
title: getProviderPageTitle(provider),
subtitle: `Browse ${provider.modelCount} tracked ${provider.name} models with pricing, context windows, default model selection, and capability coverage.`,
})
}
32 changes: 19 additions & 13 deletions apps/sim/app/(landing)/models/(shell)/[provider]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ import {
formatPrice,
formatTokenCount,
getProviderBySlug,
getProviderPageDescription,
getProviderPageTitle,
MODEL_PROVIDERS_WITH_CATALOGS,
MODEL_PROVIDERS_WITH_MODELS,
TOP_MODEL_PROVIDERS,
Expand Down Expand Up @@ -50,31 +52,35 @@ export async function generateMetadata({
return {}
}

const providerFaqs = buildProviderFaqs(provider)
const title = getProviderPageTitle(provider)
const description = getProviderPageDescription(provider)

return {
title: `${provider.name} Models`,
description: `Browse ${provider.modelCount} ${provider.name} models tracked in Sim. Compare pricing, context windows, default model selection, and capabilities for ${provider.name}'s AI model lineup.`,
title,
description,
keywords: [
`${provider.name} models`,
`${provider.name} pricing`,
`${provider.name} context window`,
`${provider.name} model list`,
`${provider.name} AI models`,
...provider.models.slice(0, 6).map((model) => model.displayName),
...new Set([
`${provider.apiName} API pricing`,
`${provider.modelFamily} API pricing`,
`${provider.name} pricing`,
`${provider.modelFamily} context window`,
`${provider.name} models`,
`${provider.name} model list`,
...provider.models.slice(0, 6).map((model) => model.displayName),
]),
],
// og:image/twitter:image come from the sibling opengraph-image.tsx -
// Next serves it at a hash-suffixed URL, so hardcoding it here 404s.
openGraph: {
title: `${provider.name} Models | Sim`,
description: `Explore ${provider.modelCount} ${provider.name} models with pricing and capability details.`,
title: `${title} | Sim`,
description,
url: `${baseUrl}${provider.href}`,
type: 'website',
},
twitter: {
card: 'summary_large_image',
title: `${provider.name} Models | Sim`,
description: providerFaqs[0]?.answer ?? provider.summary,
title: `${title} | Sim`,
description,
},
alternates: {
canonical: `${baseUrl}${provider.href}`,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { notFound } from 'next/navigation'
import { COVER_OG_SIZE, createCoverOgImage } from '@/lib/og/cover-image'
import {
buildComparisonVerdict,
getModelComparisonBySlug,
MODEL_COMPARISONS,
} from '@/app/(landing)/models/comparisons'

export const contentType = 'image/png'
export const size = COVER_OG_SIZE

/** Pre-render catalog images separately from their sibling pages. */
export async function generateStaticParams() {
return MODEL_COMPARISONS.map((comparison) => ({ pair: comparison.slug }))
}

export default async function Image({ params }: { params: Promise<{ pair: string }> }) {
const { pair } = await params
const comparison = getModelComparisonBySlug(pair)

if (!comparison) {
notFound()
}

return createCoverOgImage({
title: comparison.title,
subtitle: buildComparisonVerdict(comparison)[0],
})
}
Loading
Loading