Skip to content

docs(cookbook): FastRouter + Scalekit AgentKit tool-calling guide#721

Open
saif-at-scalekit wants to merge 1 commit into
mainfrom
cookbook/fastrouter-agentkit-tool-calling
Open

docs(cookbook): FastRouter + Scalekit AgentKit tool-calling guide#721
saif-at-scalekit wants to merge 1 commit into
mainfrom
cookbook/fastrouter-agentkit-tool-calling

Conversation

@saif-at-scalekit
Copy link
Copy Markdown
Collaborator

@saif-at-scalekit saif-at-scalekit commented May 26, 2026

Summary

  • Adds a new cookbook showing how to build a Node.js agent that uses FastRouter as the LLM provider and Scalekit AgentKit for per-user OAuth-connected tools (Gmail, GitHub, Slack)
  • Covers B2B OAuth callback pattern, tool discovery with listScopedTools, and the agentic loop
  • Companion sample repo: https://github.com/scalekit-developers/fastrouter-scalekit-demo

Preview

https://deploy-preview-{PR_NUMBER}--scalekit-starlight.netlify.app/cookbooks/fastrouter-agentkit-tool-calling/

Summary by CodeRabbit

  • Documentation
    • Added a new cookbook guide showing how to build Node.js agents that route LLM completions while executing per-user OAuth-connected tools, including configuration, authentication flows, and implementation patterns.

Review Change Stack

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 26, 2026

Walkthrough

This PR adds a new MDX cookbook page documenting how to build a Node.js agent that combines FastRouter (OpenAI-compatible API) with Scalekit AgentKit for executing user-authorized tools. The guide covers OAuth-connected account setup, tool discovery and transformation, and the agentic loop pattern.

Changes

FastRouter AgentKit Tool-Calling Cookbook

Layer / File(s) Summary
Page metadata and overview
src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
Frontmatter and introduction section establish the cookbook purpose (building an agent that routes completions through FastRouter while executing per-user OAuth-connected tools), prerequisites, and step-by-step clone/run instructions with environment variable setup.
OAuth-connected account activation
src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
OAuth flow example demonstrates checking or creating a connected account, generating authorization links when inactive, setting up a minimal local HTTP server to capture the callback, and verifying/activating the account via auth_request_id.
Tool discovery and agentic loop
src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
Tool discovery maps Scalekit listScopedTools results to FastRouter tool definitions by transforming input_schema into FastRouter parameters format. The agentic loop constructs OpenAI-style messages, repeatedly calls FastRouter with tools enabled, executes requested tools via executeTool, appends results to history, and terminates when no tool calls are returned.
Customization and next steps
src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
Configuration guidance for selecting Scalekit connections, switching FastRouter models, overriding the system prompt via CLI or environment variable, and aggregating tools across multiple connection names; links to related documentation and additional cookbooks.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested reviewers

  • ravibits
  • amitash1912
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically describes the main change: a new cookbook documenting FastRouter and Scalekit AgentKit integration for tool-calling, which matches the +274 line addition of the MDX documentation page.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cookbook/fastrouter-agentkit-tool-calling
  • 🛠️ fix frontmatter
  • 🛠️ fix internal links

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint skipped: no ESLint configuration detected in root package.json. To enable, add eslint to devDependencies.


Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx`:
- Around line 121-163: Update the SDK example blocks to use a Tabs component
with syncKey="tech-stack" and provide equivalent code snippets for Node.js,
Python, Go, and Java for each SDK operation shown (getOrCreateConnectedAccount,
getAuthorizationLink, verifyConnectedAccountUser, listScopedTools, executeTool);
keep the existing Node.js examples (including userVerifyUrl and waitForCallback
usage) and add parallel Python/Go/Java snippets that demonstrate the same
sequence (creating/obtaining connected account, retrieving authorization link,
waiting for callback/auth_request_id, calling verifyConnectedAccountUser, and
any listScopedTools/executeTool calls) so every demonstrated SDK operation has
four-language tabs synchronized via syncKey="tech-stack".
- Around line 140-163: The example OAuth callback handler (waitForCallback) only
extracts auth_request_id and lacks validation of the OAuth state, which exposes
CSRF/account-mixup risk; update waitForCallback to also read and validate the
state query parameter against the original state value from the initiating
request (ensure the example shows where the original state is generated and
passed to userVerifyUrl), only resolve when both auth_request_id and state match
expected values, return a clear error otherwise, and then pass the authRequestId
into scalekit.actions.verifyConnectedAccountUser as shown; also correct the
prose to describe the flow as a redirect with query params (not a POST) and
mention the security check.
- Around line 2-3: The frontmatter in this MDX file has a title and description
that exceed docs limits; shorten the frontmatter fields `title` (must be ≤ 60
chars) and `description` (must be ≤ 160 chars) in the top-level YAML/MDX
frontmatter block so they comply; update the `title: 'Route LLM calls through
FastRouter with Scalekit AgentKit tools'` to a concise variant under 60
characters and shorten `description: 'Build a Node.js agent that uses FastRouter
as its LLM provider and Scalekit AgentKit for per-user OAuth-connected tools —
Gmail, GitHub, Slack, and more — without writing OAuth code per integration.'`
to a single-line summary under 160 characters, preserving key intent (FastRouter
+ Scalekit AgentKit + OAuth tools).
- Around line 165-167: The Aside component instance using <Aside type="tip">
needs an explicit title prop for accessibility; update that JSX to include a
descriptive title (e.g., title="Tip" or title="Production callback endpoint") so
it reads <Aside type="tip" title="...">, ensuring the title accurately describes
the content about replacing localhost:3000/callback and the auth_request_id
handler.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 5b50d0ba-38c6-4b4e-a7de-131b23d7e311

📥 Commits

Reviewing files that changed from the base of the PR and between 7ae093a and d01ecd2.

📒 Files selected for processing (1)
  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Redirect rules - scalekit-starlight
  • GitHub Check: Header rules - scalekit-starlight
  • GitHub Check: Pages changed - scalekit-starlight
🧰 Additional context used
📓 Path-based instructions (10)
**/*.mdx

📄 CodeRabbit inference engine (.cursorrules)

**/*.mdx: Use clear, descriptive titles that explain the purpose of the document
Include comprehensive descriptions in frontmatter metadata
Organize content with logical heading hierarchy (H2, H3, H4)
Use tableOfContents property in frontmatter when content has multiple sections
Set appropriate sidebar labels for navigation in frontmatter
Use direct instruction writing style with phrases like 'This guide shows you how to...' and 'Create an authorization URL to...'
Use second person perspective ('your application', 'you receive', 'you must') in documentation
Keep sentences concise, aiming for under 25 words per sentence
Explain the 'why' in documentation with phrases like 'This prevents CSRF attacks by...' or 'Use this to validate that...'
Use action verbs in section headings: 'Store session tokens securely', 'Validate the state parameter', 'Exchange authorization code for tokens'
Use present tense for descriptions: 'Scalekit handles the complex authentication flow', 'The SDK provides methods to refresh tokens'
Use future tense for results: 'This will redirect users to...', 'You'll receive a JWT containing...', 'Scalekit returns an authorization code'
Use transition phrases between sections: 'After the user authenticates...', 'Once the state is validated...', 'Let's take a look at how to...'
Write 1-3 opening paragraphs that explain what users will accomplish, provide context about when/why, preview key concepts, and use direct instructional language
Begin introduction sections with a clear statement of what the guide covers and explain the problem being solved
Use collapsible sections in introduction for sequence diagrams, video demonstrations, data models, and JSON examples with appropriate icons
Use numbered format within Steps component: 1. ## Title with all step content indented with exactly 3 spaces
Use action-oriented headings in step-by-step guides within Steps components
Include code examples in all 4 languages (Node.js, Python, Go, Java) within Steps co...

Files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx

⚙️ CodeRabbit configuration file

**/*.mdx: You are reviewing Scalekit developer documentation written in MDX
(Astro + Starlight framework). Apply ALL of the following checks:

Frontmatter

  • title MUST be ≤ 60 characters and clearly state what the page does.
  • description MUST be ≤ 160 characters, action-oriented, unique per page.
  • sidebar.label MUST be present and ≤ 30 characters.
  • sidebar.order MUST be set on every page that lives inside a section
    with siblings, to enforce the journey order in sidebar.config.ts.
  • Flag any missing prev / next links on pages that are clearly
    part of a sequential flow (e.g., quickstart → implement-login →
    complete-login → manage-session → logout).

Voice & Style (CLAUDE.md standards)

  • Voice: confident, direct, collaborative, instructional.
  • Person: second person only ("you", "your application"). Reject "we",
    "our", "the developer", "the user".
  • Tense: present tense for descriptions; imperative mood for instructions.
  • Flag weasel words: "simply", "just", "easy", "straightforward",
    "obviously", "of course", "note that".
  • Flag passive voice constructions where active voice is clearer.
  • Headings must be sentence case, not Title Case (except proper nouns).
  • Headings that match a real API parameter, method, or field name
    (e.g., contactID, xero_tenant_id, executeTool) should preserve
    the original casing. Do NOT flag these as sentence-case violations.
  • No heading should end with a colon or period.

Content structure

  • Journey how-to guides MUST contain numbered <Steps> (Starlight
    component). This does NOT apply to src/content/docs/cookbooks/**
    (blog-style recipes — optional <Steps>, <Tabs> after </Steps> OK;
    see cookbooks path_instructions).
  • Concept pages MUST NOT contain numbered steps — concepts explain, not instruct.
  • API reference pages MUST list parameters in a table with Name / Type /
    Required / Description columns.
  • Every page MUST end with a clear "what's next" signal — either a
    next: f...

Files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
**/*.{yml,yaml,md,mdx}

📄 CodeRabbit inference engine (.cursor/rules/browsecentral-labels.mdc)

**/*.{yml,yaml,md,mdx}: BrowseCentral labels should be maximum 3-5 words - keep concise but add context when needed
BrowseCentral labels should be action-oriented - start with verbs when possible
BrowseCentral labels should be specific and clear - add context when simple labels are ambiguous
BrowseCentral labels should be outcome-focused - describe what users accomplish and the context
BrowseCentral labels should use 'Action + Object' pattern (e.g., 'Invite users', 'Restrict sign-up', 'Set up SCIM')
BrowseCentral labels should use feature names (e.g., 'Enterprise SSO', 'Passwordless quickstart')
BrowseCentral labels should describe task completion (e.g., 'Run migrations', 'Migrate auth', 'Merge identities')
BrowseCentral labels should include specific context when needed (e.g., 'Configure Scalekit MCP server', 'Validate incoming API requests')
BrowseCentral labels should use integration context when applicable (e.g., 'Build MCP auth with your existing auth system')
BrowseCentral labels should avoid instructional prefixes: 'How to', 'Guide to', 'Implement', 'Configure', 'Learn', 'Understand'
BrowseCentral labels should avoid verbose phrases: 'Step-by-step guide', 'Complete tutorial', 'Detailed documentation'
BrowseCentral labels should avoid weak verbs: 'Enable', 'Allow', 'Provide', 'Support'

Files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
**/*.{md,mdx}

📄 CodeRabbit inference engine (.cursor/rules/deno-docs-style.mdc)

**/*.{md,mdx}: Use sentence case for all titles and headings in MD/MDX documentation
Keep page titles short and descriptive (3–7 words when possible) in MD/MDX documentation
Use outcome-focused headings that describe results, not categories (e.g., 'Run a script' not 'Scripts')
Avoid gerunds in headings when an imperative works - prefer 'Configure proxies' over 'Configuring proxies'
Keep sidebar labels concise (1–3 words), use sentence case, and focus on outcomes or objects
Use sentence case in sidebar labels without punctuation
Set frontmatter title in sentence case with a clear outcome; description in one sentence (≤160 chars); sidebar.label as shorter form of title; enable tableOfContents on longer pages
Start documentation pages with a one-paragraph overview explaining what the page covers and when to use it
Present the primary use case (80% path) first in documentation, with edge cases later
Use numbered steps for task-focused sections in documentation, with each step beginning with a verb
Break up long documentation sections with subheadings every 3–6 paragraphs
Use asides for important notes, tips, cautions, and references in documentation
Provide runnable, minimal code examples that work as-is in documentation
Prefer CLI-first examples and show file layout when helpful in documentation
Label code blocks with titles for context (e.g., 'Terminal', 'main.ts') in documentation
Keep code block annotations brief and purposeful - annotate only what matters
Use consistent variable and file names across a documentation page
Use descriptive link text in documentation (e.g., 'See permission flags' not 'click here')
Prefer relative links for internal documentation pages and include anchors for section references
Reference APIs consistently using backticks for code, file names, CLI flags, and endpoints
Use backticks for code, file names, CLI flags, and endpoints in documentation
Use lists for options and features in documentation; tables only when comparisons are cleare...

Files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
src/content/docs/**/*.mdx

📄 CodeRabbit inference engine (.cursor/rules/starlight-steps-tabs-structure.mdc)

src/content/docs/**/*.mdx: In MDX documentation files, <Steps> must contain one continuous ordered list. Wrap <Steps> around a normal Markdown ordered list such as 1. ## ...
In MDX documentation files, numbered step lines must start at column 0. Do not indent the 1. ##, 2. ##, etc.
In MDX documentation files, any content that belongs to a step must be indented with 3 spaces: paragraphs, bullets, images, <Tabs>, <TabItem>, and fenced code blocks
In MDX documentation files, prefer plain Markdown inside <Steps>. If the content is mostly <Tabs> or other JSX-heavy blocks, use normal section headings instead of <Steps>
In MDX documentation files, when <Tabs> is used inside a step, keep <Tabs>, <TabItem>, </TabItem>, and </Tabs> consistently nested under that step
In MDX documentation files, if a tabs block is not part of a numbered step, place it outside </Steps>

Files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
**/*.{ts,tsx,py,go,java,mdx,md}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx,py,go,java,mdx,md}: Use the exact SDK variable names: Node.js (scalekit), Python (scalekit_client), Go (scalekitClient), Java (scalekitClient)
Never hard-code secrets or API keys in code examples; use environment variables
Include security comments that state the threat, why the pattern is required, and what can go wrong if omitted

Files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
**/*.{mdx,md}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{mdx,md}: All code examples must use <Tabs syncKey="tech-stack"> format and include Node.js, Python, Go, and Java implementations (90% rule)
Use sentence case for all titles and headings in documentation
Use bold for first mention of important terms, UI elements, and dashboard paths (e.g., Dashboard > Authentication > Session Policy)
Use inline code for technical identifiers: variables, functions, endpoints, scopes, environment variables, file paths, and placeholders
Always include headers in tables; keep cell content concise and readable
Prefer fenced code blocks with language identifiers for all code; never use screenshots of code
Use descriptive link text; never use 'click here' or 'this' as link labels
Keep sentences simple, right-branching, and unambiguous; avoid ambiguous noun stacks and demonstrative pronouns
Use active voice; prefer 'Run the command' over 'The command should be run'
Use second person when giving instructions; address the reader as 'you'
Use present tense for procedures; 'This command installs…' not 'This command will install…'
Avoid hype, slang, and filler words like 'simply', 'just', 'obviously' in documentation
Use consistent terminology throughout; prefer standard names over synonyms
Explain security implications and threats for all security-related content
Use imperative verbs for procedure headings: 'Run a script' not 'Running a script'; 'Configure proxies' not 'Configuring proxies'
Headings must describe outcomes, not categories (good: 'Run a script'; bad: 'Scripts')
Split content into clear sections with descriptive, sentence-style titles that convey meaning without requiring the following paragraph
Keep paragraphs short; isolate critical points in their own short paragraphs
Begin sections and paragraphs with standalone topic sentences that preview content
Put the topic words at the beginning of topic sentences to support fast skimming
Put key takeaways and results at the top of documents and sections
Use bullets and tabl...

Files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
src/content/docs/**/*.{mdx,md}

📄 CodeRabbit inference engine (CLAUDE.md)

src/content/docs/**/*.{mdx,md}: Every documentation page must include frontmatter with at least: title, description, and sidebar.label
Page titles must be ≤60 characters and descriptions must be ≤160 characters
Sidebar labels must be concise (1-3 words) and use sentence case without punctuation
Use <Steps> component with single continuous ordered list; numbered steps start at column 0, continuation content indented with exactly 3 spaces
Use relative links for internal pages; include anchors for sections
Include a table of contents for documents with multiple sections; enable tableOfContents: true in frontmatter

Files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
src/content/**/*.mdx

📄 CodeRabbit inference engine (CONTRIBUTING.md)

src/content/**/*.mdx: All documentation must live as MDX files inside src/content/
Every documentation page must have frontmatter with title (≤60 characters), description (≤160 characters), sidebar label, order, and tags
Write documentation in second person using 'you' and 'your application', present tense for descriptions, and imperative for step-by-step instructions
Avoid filler phrases like 'simply', 'just', 'easily' in documentation and be direct
Explain security implications when relevant in documentation
Every code block demonstrating an SDK operation must include all four languages (Node.js, Python, Go, Java) using synced tabs with syncKey='tech-stack'
SDK variable names are fixed and must not be renamed: Node.js uses scalekit, Python uses scalekit_client, Go uses scalekitClient, Java uses scalekitClient

Files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
**/*.{md,mdx,astro,ts}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.{md,mdx,astro,ts}: Use pnpm pretty-quick --staged via pre-commit git hook to auto-format all staged .md, .mdx, .astro, .ts files with Prettier
Run pnpm format to auto-format all .md, .mdx, .astro, .ts files before pushing changes

Files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
src/content/docs/cookbooks/**/*.mdx

⚙️ CodeRabbit configuration file

src/content/docs/cookbooks/**/*.mdx: This file is a Scalekit cookbook: a standalone recipe under the
starlight-blog integration (prefix: cookbooks in astro.config.mjs).
Apply global MDX voice, style, links, and accessibility rules, but use
these cookbook-specific expectations:

Overrides to global MDX checks

  • Do NOT require sidebar.order — ordering follows the blog plugin and
    publication metadata, not sidebar.config.ts journey slots.
  • Do NOT require prev / next frontmatter — cookbooks are not a
    sequential product journey; cross-links and related docs are enough.
  • tableOfContents is optional — enable it when the post has many H2s.

Frontmatter

  • title and description follow the same length and clarity rules as
    global MDX.
  • Prefer sidebar.label for navigation consistency; if absent, do not
    treat it as a hard failure (older cookbooks may omit it).
  • date, tags, authors, excerpt, and featured are normal for
    cookbooks — verify tags match the topic (e.g. MCP, SSO, FSA).

Code examples

  • Require all four SDK tabs (Node.js, Python, Go, Java) ONLY when the
    snippet demonstrates Scalekit client SDK usage. For MCP setup, CLI,
    shell, framework-only (e.g. Next.js), or IDE configuration recipes,
    use the tabs or single-language blocks that fit the task. Do not
    demand four SDK languages for bash, JSON, env files, or non-SDK code.
  • Minimal examples (single command, config block) do not need both
    success and error paths unless the recipe is explicitly about errors.
  • Flag real-looking API keys or secrets — use placeholders such as
    YOUR_API_KEY or YOUR_CLIENT_SECRET.

<Steps> (overrides global "how-to MUST use Steps")

  • Do NOT require <Steps> on cookbooks. The global rule targets journey
    how-to pages; a cookbook may use H2 sections, <Tabs>, or prose.
  • Do NOT flag "missing Steps" when the procedure is already clear.
  • If <Steps> is used, <Tabs> or other blocks MAY appear after
    </Steps> (e.g. per–IDE ...

Files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
🧠 Learnings (14)
📚 Learning: 2026-01-30T18:18:50.883Z
Learnt from: AkshayParihar33
Repo: scalekit-inc/developer-docs PR: 415
File: src/content/docs/authenticate/fsa/multiapp/manage-apps.mdx:31-49
Timestamp: 2026-01-30T18:18:50.883Z
Learning: In all Scalekit documentation files (MDX), treat the terms 'Applications', 'Single Page Application (SPA)', 'Native Application', and 'Web Application' as proper nouns and preserve their capitalization in headings and body text. Ensure these terms remain capitalized even when used in sentence case or within prose.

Applied to files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
📚 Learning: 2026-02-04T12:47:16.544Z
Learnt from: saif-at-scalekit
Repo: scalekit-inc/developer-docs PR: 412
File: src/content/docs/dev-kit/tools/scalekit-dryrun.mdx:1-23
Timestamp: 2026-02-04T12:47:16.544Z
Learning: In scalekit-inc/developer-docs, the MDX frontmatter field order is required only when the sidebar configuration points to a directory (for auto-generation). If the sidebar.config.ts references a specific file path, the order field is not required. Apply this check to all MDX files under src/content/docs: if a file contributes to an auto-generated sidebar (directory path), ensure order is present; if it’s linked to a concrete file, order can be omitted. Use sidebar.config.ts to determine whether a given MDX file falls under directory-based vs file-specific sidebar references.

Applied to files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
📚 Learning: 2026-02-25T08:57:12.201Z
Learnt from: saif-at-scalekit
Repo: scalekit-inc/developer-docs PR: 444
File: src/content/docs/agent-auth/quickstart.mdx:2-10
Timestamp: 2026-02-25T08:57:12.201Z
Learning: In Scalekit developer-docs (Astro Starlight), do not auto-suggest adding tableOfContents in frontmatter unless the user explicitly overrides the default behavior. The default enables tableOfContents with minHeadingLevel 2 and maxHeadingLevel 3. Only set tableOfContents when you want to customize heading levels or disable it entirely; otherwise omit it for other docs.

Applied to files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
📚 Learning: 2026-02-25T13:04:27.491Z
Learnt from: saif-at-scalekit
Repo: scalekit-inc/developer-docs PR: 444
File: src/content/docs/agent-auth/start-agent-auth-coding-agents.mdx:9-17
Timestamp: 2026-02-25T13:04:27.491Z
Learning: Allow page-level CSS overrides in MDX frontmatter (head: style) for readability and engagement, even if it customizes typography beyond defaults. This applies to per-page UX decisions, including heading sizes and style tweaks, but keep overrides purposeful, accessible, and within the repository's design guidelines. Use these overrides sparingly and document the rationale for maintainability.

Applied to files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
📚 Learning: 2026-03-05T11:29:08.125Z
Learnt from: AkshayParihar33
Repo: scalekit-inc/developer-docs PR: 463
File: src/content/docs/agent-auth/providers.mdx:35-73
Timestamp: 2026-03-05T11:29:08.125Z
Learning: In src/content/docs/agent-auth/providers.mdx, the Card components intentionally use icon=" " (a space) to render consistent colored boxes since some Starlight icon names resolve to icons and others do not. Do not flag icon=" " as a placeholder issue for this file; treat this as a deliberate UX choice specific to this MDX page and avoid raising a placeholder-icon warning here.

Applied to files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
📚 Learning: 2026-03-09T07:27:56.794Z
Learnt from: saif-at-scalekit
Repo: scalekit-inc/developer-docs PR: 469
File: src/content/docs/guides/integrations/scim-integrations/azure-scim.mdx:95-107
Timestamp: 2026-03-09T07:27:56.794Z
Learning: Do not enforce the 3-space indentation rule for Steps component content as a hard style rule in MDX files under src/content/docs/**/*.mdx. Only flag/rectify it if it causes visible rendering problems in the UI. Otherwise, allow current formatting; apply this rule only when rendering issues are observed and document any fixes.

Applied to files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
📚 Learning: 2026-03-09T07:32:38.426Z
Learnt from: saif-at-scalekit
Repo: scalekit-inc/developer-docs PR: 467
File: src/content/docs/sso/guides/sso-user-attributes.mdx:108-148
Timestamp: 2026-03-09T07:32:38.426Z
Learning: In MDX code samples under src/content/docs (and similar conceptual snippets in scalekit-inc/developer-docs), when an example's sole purpose is to show how to access a specific value (e.g., reading JWT claims after token validation), omit error/non-happy-path handling to keep the snippet focused. Do not flag the absence of error paths in narrowly scoped conceptual snippets.

Applied to files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
📚 Learning: 2026-03-17T16:01:50.487Z
Learnt from: dhaneshbs
Repo: scalekit-inc/developer-docs PR: 506
File: src/content/docs/authenticate/fsa/quickstart.mdx:851-853
Timestamp: 2026-03-17T16:01:50.487Z
Learning: In the Scalekit Python SDK docs, clarify that LogoutUrlOptions is not exported from the top-level scalekit package __init__.py. The correct import path in code samples or reviews is: from scalekit.common.scalekit import LogoutUrlOptions. Do not flag this import path as incorrect in documentation or code reviews; ensure examples reflect the proper import path to avoid confusion for users.

Applied to files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
📚 Learning: 2026-02-25T03:34:41.147Z
Learnt from: saif-at-scalekit
Repo: scalekit-inc/developer-docs PR: 444
File: src/content/docs/agent-auth/start-agent-auth-coding-agents.mdx:31-31
Timestamp: 2026-02-25T03:34:41.147Z
Learning: In MDX files, import { Code } from 'astrojs/starlight/components' only if the MDX content actually uses the <Code> component. If the file uses only fenced code blocks (```), the import is not required. Apply this guideline to all MDX files (e.g., src/content/docs/**/*.mdx) to avoid unnecessary imports and reduce bundle size.

Applied to files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
📚 Learning: 2026-02-25T18:41:00.639Z
Learnt from: saif-at-scalekit
Repo: scalekit-inc/developer-docs PR: 446
File: src/content/docs/authenticate/m2m/api-auth-quickstart.mdx:78-78
Timestamp: 2026-02-25T18:41:00.639Z
Learning: Preserve full URLs inside code comments in MDX code blocks (bash/python/js) when the URLs are part of copyable examples. Do not flag these in code examples. Use relative paths in prose and hyperlinks within MDX; only enforce relative paths for markdown prose links, not for URLs inside code comments.

Applied to files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
📚 Learning: 2026-05-16T17:25:30.736Z
Learnt from: saif-at-scalekit
Repo: scalekit-inc/developer-docs PR: 693
File: src/content/docs/authenticate/mcp/troubleshooting.mdx:170-170
Timestamp: 2026-05-16T17:25:30.736Z
Learning: In this repo’s documentation (.mdx files), external links should be written using plain Markdown link syntax: `[text](url)`. Do not flag links for missing `target="_blank"` or `rel="noopener"` (avoid adding raw HTML anchors just to include those attributes), and keep the approach consistent with existing docs styling.

Applied to files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
📚 Learning: 2026-03-26T13:43:49.940Z
Learnt from: saif-at-scalekit
Repo: scalekit-inc/developer-docs PR: 539
File: src/content/docs/cookbooks/search-scalekit-docs-in-your-ide.mdx:1-15
Timestamp: 2026-03-26T13:43:49.940Z
Learning: In scalekit-inc/developer-docs, cookbook pages under `src/content/docs/cookbooks/` use directory-based auto-generation for the sidebar (configured in `src/configs/sidebar.config.ts` with routes like `/cookbooks` and `/cookbooks/**/*`). For files in this directory, do not require or flag missing `sidebar.label` in the MDX frontmatter.

Applied to files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
📚 Learning: 2026-04-25T07:22:18.321Z
Learnt from: saif-at-scalekit
Repo: scalekit-inc/developer-docs PR: 633
File: src/components/templates/agent-connectors/_setup-heyreach.mdx:12-12
Timestamp: 2026-04-25T07:22:18.321Z
Learning: In this repo’s MDX documentation files, treat `@/...` paths as aliases that resolve to the `src/` directory (e.g., `@/assets/docs/foo/bar.png` -> `src/assets/docs/foo/bar.png`). When reviewing, do not flag `@`-prefixed image (or other asset) paths as broken; instead, verify that the corresponding physical file exists under `src/`.

Applied to files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
📚 Learning: 2026-05-16T17:25:30.736Z
Learnt from: saif-at-scalekit
Repo: scalekit-inc/developer-docs PR: 693
File: src/content/docs/authenticate/mcp/troubleshooting.mdx:170-170
Timestamp: 2026-05-16T17:25:30.736Z
Learning: In this repo’s documentation (MD/MDX), external links should be written using plain Markdown link syntax: `[text](url)`. Do not flag external links for missing `target="_blank"` or `rel="noopener"`, and avoid converting Markdown links into raw HTML `<a>` tags just to add those attributes, since that would be inconsistent with the established doc pattern.

Applied to files:

  • src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx
🪛 LanguageTool
src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx

[uncategorized] ~248-~248: The official name of this software platform is spelled with a capital “H”.
Context: ...------| | gmail | Gmail read/send | | github | Repositories, issues, pull requests ...

(GITHUB)

Comment on lines +2 to +3
title: 'Route LLM calls through FastRouter with Scalekit AgentKit tools'
description: 'Build a Node.js agent that uses FastRouter as its LLM provider and Scalekit AgentKit for per-user OAuth-connected tools — Gmail, GitHub, Slack, and more — without writing OAuth code per integration.'
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Frontmatter title/description exceed documented limits.

title is over 60 characters and description is over 160 characters. Please shorten both to meet docs metadata constraints.

Suggested edit
-title: 'Route LLM calls through FastRouter with Scalekit AgentKit tools'
-description: 'Build a Node.js agent that uses FastRouter as its LLM provider and Scalekit AgentKit for per-user OAuth-connected tools — Gmail, GitHub, Slack, and more — without writing OAuth code per integration.'
+title: 'Build a FastRouter AgentKit tool-calling agent'
+description: 'Build a Node.js agent that routes FastRouter LLM calls and executes per-user OAuth-connected tools through Scalekit AgentKit.'

As per coding guidelines: “title MUST be ≤ 60 characters” and “description MUST be ≤ 160 characters.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx` around lines
2 - 3, The frontmatter in this MDX file has a title and description that exceed
docs limits; shorten the frontmatter fields `title` (must be ≤ 60 chars) and
`description` (must be ≤ 160 chars) in the top-level YAML/MDX frontmatter block
so they comply; update the `title: 'Route LLM calls through FastRouter with
Scalekit AgentKit tools'` to a concise variant under 60 characters and shorten
`description: 'Build a Node.js agent that uses FastRouter as its LLM provider
and Scalekit AgentKit for per-user OAuth-connected tools — Gmail, GitHub, Slack,
and more — without writing OAuth code per integration.'` to a single-line
summary under 160 characters, preserving key intent (FastRouter + Scalekit
AgentKit + OAuth tools).

Comment on lines +121 to +163
```typescript
const userVerifyUrl = 'http://localhost:3000/callback';

const { connectedAccount } = await scalekit.actions.getOrCreateConnectedAccount({
connectionName: 'gmail',
identifier: 'user_123',
userVerifyUrl,
});

if (connectedAccount?.status !== ConnectorStatus.ACTIVE) {
const { link } = await scalekit.actions.getAuthorizationLink({
connectionName: 'gmail',
identifier: 'user_123',
userVerifyUrl,
});
// Show link to user, wait for callback
}
```

`userVerifyUrl` is where Scalekit redirects after the OAuth flow completes. The sample runs a minimal HTTP server on `localhost:3000` to catch that redirect, extract the `auth_request_id` parameter, and call `verifyConnectedAccountUser` to mark the account active:

```typescript
async function waitForCallback(port: number): Promise<string> {
return new Promise((resolve, reject) => {
const server = http.createServer((req, res) => {
const url = new URL(req.url ?? '/', `http://localhost:${port}`);
const authRequestId = url.searchParams.get('auth_request_id');
res.writeHead(200, { 'Content-Type': 'text/html' });
res.end('<html><body><h2>Authorization complete — return to your terminal.</h2></body></html>');
server.close();
if (authRequestId) resolve(authRequestId);
else reject(new Error('No auth_request_id in callback'));
});
server.listen(port);
});
}

const authRequestId = await waitForCallback(3000);
await scalekit.actions.verifyConnectedAccountUser({
authRequestId,
identifier: 'user_123',
});
```
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

SDK usage examples should include Node.js, Python, Go, and Java tabs.

These snippets demonstrate Scalekit SDK operations (getOrCreateConnectedAccount, getAuthorizationLink, verifyConnectedAccountUser, listScopedTools, executeTool) but only provide Node.js. Add <Tabs syncKey="tech-stack"> with all four languages for these SDK examples.

As per coding guidelines: “Every code block demonstrating an SDK operation must include all four languages (Node.js, Python, Go, Java) using synced tabs with syncKey='tech-stack'.”

Also applies to: 173-190, 198-237, 263-267

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx` around lines
121 - 163, Update the SDK example blocks to use a Tabs component with
syncKey="tech-stack" and provide equivalent code snippets for Node.js, Python,
Go, and Java for each SDK operation shown (getOrCreateConnectedAccount,
getAuthorizationLink, verifyConnectedAccountUser, listScopedTools, executeTool);
keep the existing Node.js examples (including userVerifyUrl and waitForCallback
usage) and add parallel Python/Go/Java snippets that demonstrate the same
sequence (creating/obtaining connected account, retrieving authorization link,
waiting for callback/auth_request_id, calling verifyConnectedAccountUser, and
any listScopedTools/executeTool calls) so every demonstrated SDK operation has
four-language tabs synchronized via syncKey="tech-stack".

Comment on lines +140 to +163
`userVerifyUrl` is where Scalekit redirects after the OAuth flow completes. The sample runs a minimal HTTP server on `localhost:3000` to catch that redirect, extract the `auth_request_id` parameter, and call `verifyConnectedAccountUser` to mark the account active:

```typescript
async function waitForCallback(port: number): Promise<string> {
return new Promise((resolve, reject) => {
const server = http.createServer((req, res) => {
const url = new URL(req.url ?? '/', `http://localhost:${port}`);
const authRequestId = url.searchParams.get('auth_request_id');
res.writeHead(200, { 'Content-Type': 'text/html' });
res.end('<html><body><h2>Authorization complete — return to your terminal.</h2></body></html>');
server.close();
if (authRequestId) resolve(authRequestId);
else reject(new Error('No auth_request_id in callback'));
});
server.listen(port);
});
}

const authRequestId = await waitForCallback(3000);
await scalekit.actions.verifyConnectedAccountUser({
authRequestId,
identifier: 'user_123',
});
```
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

OAuth callback example should validate state and correct callback semantics.

The sample verifies only auth_request_id; it should also validate state to mitigate CSRF and account-mixup risk. Also, Line 166 says Scalekit “posts” auth_request_id; this flow is shown elsewhere in docs as a redirect with query params.

Suggested edit
-const authRequestId = await waitForCallback(3000);
+const { authRequestId, state } = await waitForCallback(3000);
+if (state !== expectedStateFromSession) {
+  throw new Error('Invalid OAuth state');
+}
 await scalekit.actions.verifyConnectedAccountUser({
   authRequestId,
   identifier: 'user_123',
 });

As per coding guidelines: “Explain security implications when relevant” and include security-sensitive handling; based on learnings, callback verification should include both auth_request_id and state.

Also applies to: 166-166

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx` around lines
140 - 163, The example OAuth callback handler (waitForCallback) only extracts
auth_request_id and lacks validation of the OAuth state, which exposes
CSRF/account-mixup risk; update waitForCallback to also read and validate the
state query parameter against the original state value from the initiating
request (ensure the example shows where the original state is generated and
passed to userVerifyUrl), only resolve when both auth_request_id and state match
expected values, return a clear error otherwise, and then pass the authRequestId
into scalekit.actions.verifyConnectedAccountUser as shown; also correct the
prose to describe the flow as a redirect with query params (not a POST) and
mention the security check.

Comment on lines +165 to +167
<Aside type="tip">
In a production web app, replace `localhost:3000/callback` with your server's callback endpoint. Scalekit posts the `auth_request_id` there, and your handler calls `verifyConnectedAccountUser` to complete account activation.
</Aside>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add a title to the Aside component.

<Aside type="tip"> should include a title prop for accessibility and consistency.

Suggested edit
-<Aside type="tip">
+<Aside type="tip" title="Production callback handling">

As per coding guidelines: “Always include a title attribute for <Aside> components for accessibility and clarity.”

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<Aside type="tip">
In a production web app, replace `localhost:3000/callback` with your server's callback endpoint. Scalekit posts the `auth_request_id` there, and your handler calls `verifyConnectedAccountUser` to complete account activation.
</Aside>
<Aside type="tip" title="Production callback handling">
In a production web app, replace `localhost:3000/callback` with your server's callback endpoint. Scalekit posts the `auth_request_id` there, and your handler calls `verifyConnectedAccountUser` to complete account activation.
</Aside>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx` around lines
165 - 167, The Aside component instance using <Aside type="tip"> needs an
explicit title prop for accessibility; update that JSX to include a descriptive
title (e.g., title="Tip" or title="Production callback endpoint") so it reads
<Aside type="tip" title="...">, ensuring the title accurately describes the
content about replacing localhost:3000/callback and the auth_request_id handler.

@netlify
Copy link
Copy Markdown

netlify Bot commented May 26, 2026

Deploy Preview for scalekit-starlight ready!

Name Link
🔨 Latest commit d01ecd2
🔍 Latest deploy log https://app.netlify.com/projects/scalekit-starlight/deploys/6a153deb511ff60008cbb27a
😎 Deploy Preview https://deploy-preview-721--scalekit-starlight.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant