Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
c7587bd
fix(docs): removed the old guide section from docs, added new plugins…
frontegg-david Nov 17, 2025
e9e7fcf
fix(plugins): Add CodeCall plugin
frontegg-david Nov 17, 2025
7e5a05a
fix(sdk): Extend tool output schema types and add prettier
frontegg-david Nov 17, 2025
c3bb233
fix(sdk): fix pr comments
frontegg-david Nov 18, 2025
d189ed8
fix(sdk): add tool output parser
frontegg-david Nov 18, 2025
eded7c8
fix(sdk): fix pr comments
frontegg-david Nov 18, 2025
f9c33ed
fix(sdk): fix pr comments
frontegg-david Nov 18, 2025
d4d56c3
fix(md): add CODE_OF_CONDUCT.md
frontegg-david Nov 18, 2025
f2bf464
Merge branch 'main' into extend-tool-output-schema
frontegg-david Nov 18, 2025
30008e8
fix(md): fix tool parsing input/output
frontegg-david Nov 18, 2025
be99bb4
fix(md): fix tool parsing input/output
frontegg-david Nov 18, 2025
a430f3b
fix(md): fix tool parsing input/output
frontegg-david Nov 18, 2025
fc54ad5
fix(sdk): add support for dynamic output schema and fix input schema
frontegg-david Nov 18, 2025
c5ea5a2
fix(sdk): add test to new lib and fix pr comments
frontegg-david Nov 18, 2025
223f730
fix pr comments
frontegg-david Nov 18, 2025
785ce88
feat(security): add security test to regex passed to json-schema-to-z…
frontegg-david Nov 18, 2025
304de82
feat(sdk): fix testa and pr comments
frontegg-david Nov 18, 2025
7267205
feat(sdk): fix testa and pr comments
frontegg-david Nov 18, 2025
bec6614
feat(sdk): fix types
frontegg-david Nov 18, 2025
ca2c8f9
feat(sdk): fix some lints
frontegg-david Nov 19, 2025
bae6154
feat(sdk): fix regex security config settings
frontegg-david Nov 19, 2025
dc237b6
feat(sdk): fix pr comments
frontegg-david Nov 19, 2025
7c09fbd
feat(sdk): fix pr comments
frontegg-david Nov 19, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions .github/workflows/push.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
name: On Push

on: push

jobs:
build:
runs-on: ubuntu-latest
env:
NX_DAEMON: "false"

steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Setup Node
uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
cache: 'yarn'

- name: Install dependencies
run: yarn install --frozen-lockfile

- name: Run linter
run: npx nx run-many -t lint
continue-on-error: true

- name: Run prettier
run: npx prettier --check .
continue-on-error: true

- name: Build libraries
run: npx nx run-many -t build

- name: Test libraries
run: npx nx run-many -t test --passWithNoTests
5 changes: 4 additions & 1 deletion .prettierrc
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@
}
},
{
"files": ["*.yml", "*.yaml"],
"files": [
"*.yml",
"*.yaml"
],
"options": {
"singleQuote": false
}
Expand Down
101 changes: 101 additions & 0 deletions CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
# Contributor Covenant Code of Conduct

## Our Pledge

We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for
everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity
and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion,
or sexual identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

## Our Standards

Examples of behavior that contributes to a positive environment for our community include:

- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
- Focusing on what is best not just for us as individuals, but for the overall community

Examples of unacceptable behavior include:

- The use of sexualized language or imagery, and sexual attention or advances of any kind
- Trolling, insulting, or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or email address, without their explicit permission
- Other conduct which could reasonably be considered inappropriate in a professional setting

## Enforcement Responsibilities

Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take
appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.

Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits,
issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for
moderation decisions when appropriate.

## Scope

This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing
the community in public spaces. Examples of representing our community include using an official e-mail address, posting
via an official social media account, or acting as an appointed representative at an online or offline event.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible
for enforcement at <david@frontegg.com>. All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the reporter of any incident.

## Enforcement Guidelines

Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem
in violation of this Code of Conduct:

### 1. Correction

**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the
community.

**Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation
and an explanation of why the behavior was inappropriate. A public apology may be requested.

### 2. Warning

**Community Impact**: A violation through a single incident or series of actions.

**Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including
unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding
interactions in community spaces as well as external channels like social media. Violating these terms may lead to a
temporary or permanent ban.

### 3. Temporary Ban

**Community Impact**: A serious violation of community standards, including sustained inappropriate behavior.

**Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified
period of time. No public or private interaction with the people involved, including unsolicited interaction with those
enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

### 4. Permanent Ban

**Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate
behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

**Consequence**: A permanent ban from any sort of public interaction within the community.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0, available at
<https://www.contributor-covenant.org/version/2/0/code_of_conduct.html>.

Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity).

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see the FAQ at <https://www.contributor-covenant.org/faq>.
Translations are available at <https://www.contributor-covenant.org/translations>.
12 changes: 5 additions & 7 deletions apps/demo/src/apps/calculator/tools/abs.tool.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
import {Tool, ToolContext} from "@frontmcp/sdk";
import {z} from "zod";
import { Tool, ToolContext } from '@frontmcp/sdk';
import { z } from 'zod';

@Tool({
name: 'abs',
description: 'Absolute value of x',
inputSchema: {x: z.number()},
outputSchema: {result: z.number()}
inputSchema: { x: z.number() },
outputSchema: 'number',
})
export default class AbsTool extends ToolContext {
async execute(input: { x: number }) {
return {
result: Math.abs(input.x),
};
return Math.abs(input.x);
}
}
6 changes: 2 additions & 4 deletions apps/demo/src/apps/calculator/tools/add.tool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,10 @@ import {z} from "zod";
name: 'add',
description: 'Add two numbers',
inputSchema: {a: z.number(), b: z.number()},
outputSchema: {result: z.number()}
outputSchema: 'number'
})
export default class AddTool extends ToolContext {
async execute(input: { a: number, b: number }) {
return {
result: input.a + input.b,
};
return input.a + input.b
}
}
6 changes: 2 additions & 4 deletions apps/demo/src/apps/calculator/tools/ceil.tool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,10 @@ import {z} from "zod";
name: 'ceil',
description: 'Ceil of x (smallest integer ≥ x)',
inputSchema: {x: z.number()},
outputSchema: {result: z.number()}
outputSchema: 'number'
})
export default class CeilTool extends ToolContext {
async execute(input: { x: number }) {
return {
result: Math.ceil(input.x),
};
return Math.ceil(input.x)
}
}
6 changes: 2 additions & 4 deletions apps/demo/src/apps/calculator/tools/divide.tool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,10 @@ import {z} from "zod";
name: 'divide',
description: 'Divide a by b',
inputSchema: {a: z.number(), b: z.number().refine((n) => n !== 0, 'Division by zero is not allowed')},
outputSchema: {result: z.number()}
outputSchema: 'number'
})
export default class DivideTool extends ToolContext {
async execute(input: { a: number, b: number }) {
return {
result: input.a / input.b,
};
return input.a / input.b
}
}
6 changes: 2 additions & 4 deletions apps/demo/src/apps/calculator/tools/exp.tool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,10 @@ import {z} from "zod";
name: 'exp',
description: 'e raised to the power of x',
inputSchema: {x: z.number()},
outputSchema: {result: z.number()}
outputSchema: 'number'
})
export default class ExpTool extends ToolContext {
async execute(input: { x: number }) {
return {
result: Math.exp(input.x),
};
return Math.exp(input.x)
}
}
6 changes: 2 additions & 4 deletions apps/demo/src/apps/calculator/tools/floor.tool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,10 @@ import {z} from "zod";
name: 'floor',
description: 'Floor of x (largest integer ≤ x)',
inputSchema: {x: z.number()},
outputSchema: {result: z.number()}
outputSchema: 'number'
})
export default class FloorTool extends ToolContext {
async execute(input: { x: number }) {
return {
result: Math.floor(input.x),
};
return Math.floor(input.x)
}
}
6 changes: 2 additions & 4 deletions apps/demo/src/apps/calculator/tools/max.tool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,10 @@ import {z} from "zod";
name: 'max',
description: 'Maximum value in an array of numbers',
inputSchema: {values: z.array(z.number()).min(1)},
outputSchema: {result: z.number()}
outputSchema: 'number'
})
export default class MaxTool extends ToolContext {
async execute(input: { values: number[] }) {
return {
result: Math.max(...input.values),
};
return Math.max(...input.values)
}
}
6 changes: 2 additions & 4 deletions apps/demo/src/apps/calculator/tools/min.tool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,10 @@ import {z} from "zod";
name: 'min',
description: 'Minimum value in an array of numbers',
inputSchema: {values: z.array(z.number()).min(1)},
outputSchema: {result: z.number()}
outputSchema: 'number'
})
export default class MinTool extends ToolContext {
async execute(input: { values: number[] }) {
return {
result: Math.min(...input.values),
};
return Math.min(...input.values);
}
}
6 changes: 2 additions & 4 deletions apps/demo/src/apps/calculator/tools/modulo.tool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,10 @@ import {z} from "zod";
name: 'modulo',
description: 'Remainder of a divided by b (JavaScript % semantics)',
inputSchema: {a: z.number(), b: z.number().refine((n) => n !== 0, 'Modulo by zero is not allowed')},
outputSchema: {result: z.number()}
outputSchema: 'number'
})
export default class ModuloTool extends ToolContext {
async execute(input: { a: number, b: number }) {
return {
result: input.a % input.b,
};
return input.a % input.b;
}
}
14 changes: 6 additions & 8 deletions apps/demo/src/apps/calculator/tools/multiply.tool.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
import {Tool, ToolContext} from "@frontmcp/sdk";
import {z} from "zod";
import { Tool, ToolContext } from '@frontmcp/sdk';
import { z } from 'zod';

@Tool({
name: 'multiply',
description: 'Multiply two numbers',
inputSchema: {a: z.number(), b: z.number()},
outputSchema: {result: z.number()}
inputSchema: { a: z.number(), b: z.number() },
outputSchema: 'number',
})
export default class MultiplyTool extends ToolContext {
async execute(input: { a: number, b: number }) {
return {
result: input.a * input.b,
};
async execute(input: { a: number; b: number }) {
return input.a * input.b;
}
}
15 changes: 6 additions & 9 deletions apps/demo/src/apps/calculator/tools/pow.tool.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,14 @@
import {Tool, ToolContext} from "@frontmcp/sdk";
import {z} from "zod";
import { Tool, ToolContext } from '@frontmcp/sdk';
import { z } from 'zod';

@Tool({
name: 'pow',
description: 'Raise a to the power of b (a^b)',
inputSchema: {a: z.number(), b: z.number()},
outputSchema: {result: z.number()}
inputSchema: { a: z.number(), b: z.number() },
outputSchema: 'number',
})
export default class PowTool extends ToolContext {
async execute(input: { a: number, b: number }) {
const result = Math.pow(input.a, input.b);
return {
result,
};
async execute(input: { a: number; b: number }) {
return Math.pow(input.a, input.b);
}
}
13 changes: 6 additions & 7 deletions apps/demo/src/apps/calculator/tools/round.tool.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {Tool, ToolContext} from "@frontmcp/sdk";
import {z} from "zod";
import { Tool, ToolContext } from '@frontmcp/sdk';
import { z } from 'zod';

@Tool({
name: 'round',
Expand All @@ -8,16 +8,15 @@ import {z} from "zod";
x: z.number(),
digits: z.number().int().min(0).max(15).optional(),
},
outputSchema: {result: z.number()}
outputSchema: 'number',
})
export default class RoundTool extends ToolContext {
async execute(input: { x: number, digits?: number }) {
async execute(input: { x: number; digits?: number }) {
const { x, digits } = input;
if (digits === undefined) {
return { result: Math.round(x) };
return Math.round(x);
}
const factor = Math.pow(10, digits);
const result = Math.round((x + Number.EPSILON) * factor) / factor;
return { result };
return Math.round((x + Number.EPSILON) * factor) / factor;
}
}
12 changes: 5 additions & 7 deletions apps/demo/src/apps/calculator/tools/sqrt.tool.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
import {Tool, ToolContext} from "@frontmcp/sdk";
import {z} from "zod";
import { Tool, ToolContext } from '@frontmcp/sdk';
import { z } from 'zod';

@Tool({
name: 'sqrt',
description: 'Square root of x',
inputSchema: {x: z.number().nonnegative('x must be >= 0')},
outputSchema: {result: z.number()}
inputSchema: { x: z.number().nonnegative('x must be >= 0') },
outputSchema: 'number',
})
export default class SqrtTool extends ToolContext {
async execute(input: { x: number }) {
return {
result: Math.sqrt(input.x),
};
return Math.sqrt(input.x);
}
}
Loading
Loading