Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
f07f6bf
feat: add embedded MCP server with user-scoped token authentication (…
salevine Jul 10, 2026
b55ba0a
feat(mcp): app-builder tools + adversarial security hardening
salevine Jul 11, 2026
de790f9
fix(mcp): review round — flag-off healthcheck, token expiry UX, sessi…
salevine Jul 11, 2026
673f6d4
fix(mcp): fix failing server unit tests (CsrfTest, manager test)
salevine Jul 11, 2026
1aed8c5
fix(mcp): CsrfTest filter-order + McpTokens font-family test assertion
salevine Jul 11, 2026
e5ed59b
fix(mcp): stop MCP auth manager from hijacking form-login (CsrfTest 500)
salevine Jul 11, 2026
0bb4bbd
feat(mcp): app-builder capability release — lint, instructions, catal…
salevine Jul 12, 2026
d362734
feat(mcp): safe direct-authoring MCP v1 — governance, CRUD, data laye…
salevine Jul 13, 2026
0ec4d8b
fix(mcp): green CI — prettier/lint formatting, Java test fixes, rever…
salevine Jul 13, 2026
aac87f2
fix(mcp): format McpTokens.tsx (prettier) and drop redundant rotate s…
salevine Jul 13, 2026
da31c7b
test(mcp): integration-test governance store against real Mongo + Redis
salevine Jul 13, 2026
8c49436
feat(mcp): close the CRUD loop — datasource creation, display binding…
salevine Jul 13, 2026
bfeba6d
feat(mcp): enable MCP by default with an Admin Settings toggle
salevine Jul 13, 2026
77a6e22
fix(mcp): live-test fixes, reachable token UI, and admin-settable tok…
salevine Jul 13, 2026
dd0e8ea
feat(mcp): REST datasource creation + fix live app-build blockers
salevine Jul 13, 2026
b5c0119
fix(mcp): resolve actions via applicationId (getAction 405) so run_ac…
salevine Jul 13, 2026
8813ee2
feat(mcp): dynamic REST paths, query-bound tables, fixed layout — wor…
salevine Jul 13, 2026
e4c03e3
fix(mcp): emit current DSL version so the client runs zero migrations
salevine Jul 13, 2026
629bc1e
feat(mcp): enable data tools and JS objects by default
salevine Jul 13, 2026
d7e7897
fix(mcp): guard table query bindings so the table is valid before the…
salevine Jul 13, 2026
dde8870
feat(mcp): reset action, clear-on-empty table binding, and zebra row …
salevine Jul 13, 2026
504e16b
feat(mcp): input validation formats and disable-when-invalid wiring
salevine Jul 13, 2026
f4bf271
fix(mcp): only REST GET/HEAD is confirmation-free; never trust SQL te…
salevine Jul 14, 2026
90afa75
fix(mcp): add configurable Host allowlist for /mcp (DNS-rebinding def…
salevine Jul 14, 2026
dbb9617
feat(mcp): make the agent see (and use) more of Appsmith's capabilities
salevine Jul 14, 2026
9bcbb29
feat(mcp): surface the MCP server URL on the tokens page
salevine Jul 14, 2026
a2b8ae5
test(cypress): target the profile email field by test id, not last input
salevine Jul 14, 2026
dad3474
feat(mcp): conditional visibility / view switching (visibleWhen)
salevine Jul 14, 2026
92117cc
fix(mcp): make the select widget's options render (sourceData) + reje…
salevine Jul 14, 2026
6c9e5c1
feat(mcp): add card grid (List Widget V2) to the app builder
salevine Jul 14, 2026
e048608
feat(mcp): milestone 1 — safety hardening for the default-on MCP surface
salevine Jul 14, 2026
e00466f
feat(mcp): M2-T1 — lock mcp_ tokens to the MCP flow (internal marker …
salevine Jul 14, 2026
eee866f
feat(mcp): M2-T2 admin audit visibility + M2-T3 rate-limit keying
salevine Jul 15, 2026
77cb991
test(mcp): M3 — close CI/test gaps (integration suite, flag-off, migr…
salevine Jul 15, 2026
dea69f4
feat(mcp): M4-T1 query-bound charts/selects + query ordering/aggregat…
salevine Jul 15, 2026
7b5fcb3
feat(mcp): M4-T5 widen widget catalog (+5 widgets); M4-T6 widget-vers…
salevine Jul 15, 2026
0f58ec4
feat(mcp): M4-T2 MongoDB + Google Sheets datasources and structured q…
salevine Jul 15, 2026
01df201
feat(mcp): M4-T4 usage telemetry (token-created analytics + tool-invo…
salevine Jul 15, 2026
71e0bd9
feat(mcp): audit-log direct /api/v1 token rejections + hash username …
salevine Jul 15, 2026
122fb57
fix(mcp): reformat README.md table to satisfy Prettier CI check
salevine Jul 15, 2026
e6fd46b
fix(mcp): enforce the MCP allowlist filter (denied requests no longer…
salevine Jul 15, 2026
9b4dfe5
fix(mcp): evict own oldest session at per-user cap instead of 429 loc…
salevine Jul 16, 2026
648ff0a
feat(mcp): M5 — store accumulation vocabulary, auto-publish + URLs, a…
salevine Jul 16, 2026
d034732
fix(mcp): 404 for dead sessions (spec compliance), deployNote on edit…
salevine Jul 16, 2026
e491504
feat(mcp): M6 canvas awareness — overlap prevention, resize op, modal…
salevine Jul 16, 2026
a0be711
feat(mcp): M7 git awareness — status gate, mcp/ agent branches, elici…
salevine Jul 16, 2026
4098b2f
feat(mcp): human-approval elicitation for all destructive ops + field…
salevine Jul 17, 2026
7552451
refactor(mcp): extract git projections, prompt hygiene, and build inf…
salevine Jul 17, 2026
324b23b
Merge remote-tracking branch 'origin/release' into feat/15383/add_mcp…
salevine Jul 17, 2026
466a98c
feat(mcp): M9 live-integration fixes — git-state 405, build URLs, lay…
salevine Jul 17, 2026
36b7551
chore: gitignore the local .gitnexus index directory
salevine Jul 17, 2026
6afe0a1
fix(mcp): disambiguate elicitation non-accept outcomes in destructive…
salevine Jul 19, 2026
7ce78a4
feat(mcp): harden destructive-approval elicitation for broken clients
salevine Jul 19, 2026
2cb6579
feat(mcp): bind text and image widgets to a query response field
salevine Jul 19, 2026
a3dc250
feat(mcp): extend wire_event to select/input/checkbox/switch/datepick…
salevine Jul 19, 2026
835510d
feat(mcp): computed display values for text widgets (now/count/concat)
salevine Jul 19, 2026
abe9735
feat(mcp): visibleWhen predicates, strict elicitation mode, hand-auth…
salevine Jul 19, 2026
8ac7694
chore(mcp): prettier-format README env-var tables
salevine Jul 19, 2026
3c77fe7
feat(mcp): formula AST — compiled arithmetic for text computed values
salevine Jul 19, 2026
9543878
fix(mcp): scope governance audit reads to the caller's tenant
salevine Jul 19, 2026
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
21 changes: 20 additions & 1 deletion .github/workflows/ad-hoc-docker-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,15 @@ jobs:
with:
branch: ${{ inputs.branch }}

mcp-build:
name: mcp-build
uses: ./.github/workflows/mcp-build.yml
secrets: inherit
with:
branch: ${{ inputs.branch }}

package:
needs: [server-build, client-build, rts-build]
needs: [server-build, client-build, rts-build, mcp-build]
runs-on: ubuntu-latest
# Set permissions since we're using OIDC token authentication between Depot and GitHub
permissions:
Expand Down Expand Up @@ -94,6 +101,18 @@ jobs:
echo "Cleaning up the tar files"
rm app/client/packages/rts/dist/rts-dist.tar

- name: Download the MCP build artifact
uses: actions/download-artifact@v4
with:
name: mcp-dist
path: app/client/packages/mcp/dist

- name: Untar the MCP folder
run: |
tar -xvf app/client/packages/mcp/dist/mcp-dist.tar -C app/client/packages/mcp/
echo "Cleaning up the MCP tar files"
rm app/client/packages/mcp/dist/mcp-dist.tar

- name: Generate info.json
id: info_json
run: |
Expand Down
11 changes: 10 additions & 1 deletion .github/workflows/build-client-server-count.yml
Original file line number Diff line number Diff line change
Expand Up @@ -147,8 +147,17 @@ jobs:
with:
pr: ${{fromJson(needs.file-check.outputs.pr)}}

mcp-build:
name: mcp-build
needs: [file-check]
if: success() && needs.file-check.outputs.runId == 0
uses: ./.github/workflows/mcp-build.yml
secrets: inherit
with:
pr: ${{fromJson(needs.file-check.outputs.pr)}}

build-docker-image:
needs: [file-check, client-build, server-build, rts-build]
needs: [file-check, client-build, server-build, rts-build, mcp-build]
# Only run if the build step is successful
if: success() && needs.file-check.outputs.runId == '0'
name: build-docker-image
Expand Down
11 changes: 10 additions & 1 deletion .github/workflows/build-client-server.yml
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,17 @@ jobs:
with:
pr: ${{fromJson(needs.file-check.outputs.pr)}}

mcp-build:
name: mcp-build
needs: [file-check]
if: success() && needs.file-check.outputs.runId == '0'
uses: ./.github/workflows/mcp-build.yml
secrets: inherit
with:
pr: ${{fromJson(needs.file-check.outputs.pr)}}

build-docker-image:
needs: [file-check, client-build, server-build, rts-build]
needs: [file-check, client-build, server-build, rts-build, mcp-build]
Comment thread
coderabbitai[bot] marked this conversation as resolved.
# Only run if the build step is successful
if: success() && needs.file-check.outputs.runId == '0'
name: build-docker-image
Expand Down
13 changes: 13 additions & 0 deletions .github/workflows/build-docker-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,19 @@ jobs:
echo "Cleaning up the tar files"
rm app/client/packages/rts/dist/rts-dist.tar

- name: Download the MCP build artifact
if: steps.run_result.outputs.run_result != 'success'
uses: actions/download-artifact@v4
with:
name: mcp-dist
path: app/client/packages/mcp/dist

- name: Un-tar the MCP folder
run: |
tar -xvf app/client/packages/mcp/dist/mcp-dist.tar -C app/client/packages/mcp/
echo "Cleaning up the MCP tar files"
rm app/client/packages/mcp/dist/mcp-dist.tar

- name: Generate info.json
id: info_json
run: |
Expand Down
6 changes: 5 additions & 1 deletion .github/workflows/docs/test-build-docker-image.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,13 @@ The `client-build` job builds the client-side codebase. It uses the configuratio

The `rts-build` job builds the "rts" (real-time suggestions) package of the client-side codebase. It uses the configuration defined in `.github/workflows/rts-build.yml` and inherits secrets from the repository.

### `mcp-build`

This job builds and tests the MCP service, then supplies its bundled artifact to the Docker-image jobs.

### `build-docker-image`

This job, named `build-docker-image`, creates and pushes the Docker image for the application. It is dependent on the success of the `client-build`, `server-build`, and `rts-build` jobs. The Docker image is built with two platforms: `linux/arm64` and `linux/amd64`.
This job, named `build-docker-image`, creates and pushes the Docker image for the application. It is dependent on the success of the `client-build`, `server-build`, `rts-build`, and `mcp-build` jobs. The Docker image is built with two platforms: `linux/arm64` and `linux/amd64`.

### `ci-test`

Expand Down
22 changes: 21 additions & 1 deletion .github/workflows/github-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -202,8 +202,16 @@ jobs:
path: app/client/packages/rts/rts-dist.tar
overwrite: true

mcp-build:
needs:
- prelude
uses: ./.github/workflows/mcp-build.yml
secrets: inherit
with:
branch: ${{ github.ref }}

package:
needs: [prelude, client-build, server-build, rts-build]
needs: [prelude, client-build, server-build, rts-build, mcp-build]

runs-on: ubuntu-latest
permissions:
Expand Down Expand Up @@ -248,6 +256,18 @@ jobs:
echo "Cleaning up the tar files"
rm app/client/packages/rts/dist/rts-dist.tar

- name: Download the MCP build artifact
uses: actions/download-artifact@v4
with:
name: mcp-dist
path: app/client/packages/mcp/dist

- name: Untar the MCP folder
run: |
tar -xvf app/client/packages/mcp/dist/mcp-dist.tar -C app/client/packages/mcp/
echo "Cleaning up the MCP tar files"
rm app/client/packages/mcp/dist/mcp-dist.tar

- name: Generate info.json
id: info_json
run: |
Expand Down
142 changes: 142 additions & 0 deletions .github/workflows/mcp-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
name: Build MCP Workflow

on:
workflow_dispatch:
workflow_call:
inputs:
pr:
description: "PR number when building a pull-request merge commit"
required: false
type: number
skip-tests:
description: "Skip unit tests for image-only builds"
required: false
type: string
default: "false"
branch:
description: "Branch to build when pr is 0"
required: false
type: string

pull_request:
branches: [release, master]
paths:
- "app/client/packages/mcp/**"

defaults:
run:
working-directory: app/client/packages/mcp
shell: bash

jobs:
build:
runs-on: ubuntu-latest
if: |
github.event.pull_request.head.repo.full_name == github.repository ||
github.event_name == 'push' ||
github.event_name == 'workflow_dispatch' ||
github.event_name == 'repository_dispatch' ||
github.event_name == 'schedule' ||
github.event_name == 'release'
# Mongo + Redis back the governance store's distributed-lock / confirmation-atomicity safety net. Without these
# service containers store.integration.test.ts stays describe.skip and that safety net never runs in CI.
services:
mongodb:
image: mongo:6.0
ports:
- 27017:27017
options: >-
--health-cmd "mongosh --quiet --eval 'db.runCommand({ ping: 1 }).ok'"
--health-interval 10s
--health-timeout 5s
--health-retries 10
redis:
image: redis:7
ports:
- 6379:6379
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 10
steps:
- name: Checkout the merged pull-request commit
if: inputs.pr != 0
uses: actions/checkout@v4
with:
fetch-tags: true
persist-credentials: false
ref: refs/pull/${{ inputs.pr }}/merge

- name: Checkout the specified branch
if: inputs.pr == 0 && inputs.branch != ''
uses: actions/checkout@v4
with:
fetch-tags: true
persist-credentials: false
ref: ${{ inputs.branch }}

- name: Checkout the head commit
if: inputs.pr == 0 && inputs.branch == ''
uses: actions/checkout@v4
with:
fetch-tags: true
persist-credentials: false

- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version-file: app/client/package.json

# actions/setup-node@v4 does not restore Yarn 3 caches from a subdirectory.
- name: Restore Yarn cache
uses: actions/cache@v4
with:
path: app/client/.yarn/cache
key: v1-yarn3-${{ hashFiles('app/client/yarn.lock') }}
restore-keys: |
v1-yarn3-

- name: Install dependencies
run: |
corepack enable
yarn install --immutable

- name: Check types
run: yarn check-types

- name: Lint
run: yarn lint

- name: Check formatting
run: yarn prettier

- name: Run unit tests
if: inputs.skip-tests != 'true'
run: yarn test:unit

# Runs ONLY the governance integration suite against the mongo+redis service containers (kept separate so the
# unit run above stays fast). With these env vars set, store.integration.test.ts's describe.skip flips to
# describe and the Redis-lock / confirmation-atomicity assertions actually execute.
- name: Run governance integration tests
if: inputs.skip-tests != 'true'
env:
APPSMITH_MONGODB_URI: mongodb://127.0.0.1:27017
APPSMITH_REDIS_URL: redis://127.0.0.1:6379
# Forces the anti-silent-no-op guard: if the mongo/redis wiring ever drifts, the step FAILS instead of the
# suite reverting to describe.skip and exiting 0 green.
MCP_REQUIRE_INTEGRATION: "1"
run: yarn test:unit src/governance/store.integration.test.ts

- name: Build
run: yarn build

- name: Tar the MCP bundle
run: tar -cvf mcp-dist.tar dist

- name: Upload MCP build bundle
uses: actions/upload-artifact@v4
with:
name: mcp-dist
path: app/client/packages/mcp/mcp-dist.tar
overwrite: true
Original file line number Diff line number Diff line change
Expand Up @@ -148,8 +148,18 @@ jobs:
body: bodyLines.join("\n"),
})

mcp-build:
needs: [resolve-params]
name: mcp-build
if: github.event.client_payload.slash_command.args.named.env != 'release'
uses: ./.github/workflows/mcp-build.yml
secrets: inherit
with:
pr: ${{ fromJSON(needs.resolve-params.outputs.pr_number) }}
skip-tests: ${{ github.event.client_payload.slash_command.args.named.skip-tests }}

push-image:
needs: [resolve-params, client-build, rts-build, server-build]
needs: [resolve-params, client-build, rts-build, mcp-build, server-build]
runs-on: ubuntu-latest
permissions:
contents: read
Expand Down Expand Up @@ -201,6 +211,18 @@ jobs:
echo "Cleaning up the tar files"
rm app/client/packages/rts/dist/rts-dist.tar

- name: Download the MCP build artifact
uses: actions/download-artifact@v4
with:
name: mcp-dist
path: app/client/packages/mcp/dist

- name: Untar the MCP folder
run: |
tar -xvf app/client/packages/mcp/dist/mcp-dist.tar -C app/client/packages/mcp/
echo "Cleaning up the MCP tar files"
rm app/client/packages/mcp/dist/mcp-dist.tar

- name: Generate info.json
id: info_json
run: |
Expand Down
13 changes: 11 additions & 2 deletions .github/workflows/playwright-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,17 @@ jobs:
pr: ${{ fromJSON(format('{0}', inputs.pr)) }}
branch: ${{ inputs.branch }}

mcp-build:
needs: path-filter
if: success() && needs.path-filter.outputs.not-ci == 'true' && inputs.docker_image_name == ''
uses: ./.github/workflows/mcp-build.yml
secrets: inherit
with:
pr: ${{ fromJSON(format('{0}', inputs.pr)) }}
branch: ${{ inputs.branch }}

build-docker-image:
needs: [client-build, server-build, rts-build, path-filter]
needs: [client-build, server-build, rts-build, mcp-build, path-filter]
if: success() && needs.path-filter.outputs.not-ci == 'true' && inputs.docker_image_name == ''
uses: ./.github/workflows/build-docker-image.yml
secrets: inherit
Expand All @@ -151,7 +160,7 @@ jobs:
branch: ${{ inputs.branch }}

playwright-e2e:
needs: [path-filter, client-build, server-build, rts-build, build-docker-image]
needs: [path-filter, client-build, server-build, rts-build, mcp-build, build-docker-image]
if: |
always() &&
needs.path-filter.result == 'success' &&
Expand Down
10 changes: 9 additions & 1 deletion .github/workflows/pr-cypress.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,16 @@ jobs:
pr: ${{ github.event.number }}
is-pg-build: ${{ github.event.pull_request.base.ref == 'pg' }}

mcp-build:
if: success()
name: mcp-build
uses: ./.github/workflows/mcp-build.yml
secrets: inherit
with:
pr: ${{ github.event.number }}

build-docker-image:
needs: [client-build, server-build, rts-build]
needs: [client-build, server-build, rts-build, mcp-build]
# Only run if the build step is successful
if: success()
name: build-docker-image
Expand Down
Loading
Loading