Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 4 additions & 0 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 22
- run: node --test scripts/test_vscode_credentials.js
- run: python3 scripts/check_readme_inventory.py
- run: python3 scripts/sync_oauth.py --check
- run: python3 -m unittest
Expand Down
8 changes: 4 additions & 4 deletions acedatacloud/vscode/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ can call it directly from chat.
2. **Get an account token** from [Account Tokens](https://platform.acedata.cloud/console/platform-tokens?utm_source=vscode_marketplace&utm_medium=referral&utm_campaign=evergreen&utm_content=acedatacloud_mcp_vscode_platform_token), following the steps below. This account server requires a `platform-...` token.
3. **Open Copilot Chat** in agent mode and ask for a account task — the extension prompts for the account token the first time and stores it in the OS keychain via VS Code's `SecretStorage`.

You can rotate or remove the API key any time from the command palette:
You can rotate or remove the account token any time from the command palette:

- **Ace Data Cloud Account MCP: Set Ace Data Cloud API Key**
- **Ace Data Cloud Account MCP: Clear Ace Data Cloud API Key**
- **Ace Data Cloud Account MCP: Set Ace Data Cloud Platform Token**
- **Ace Data Cloud Account MCP: Clear Ace Data Cloud Platform Token**

> The default config talks to the **hosted streamable-HTTP endpoint** at
> `https://mcp.acedata.cloud/mcp` — no Python, no `uvx`, no local install needed.
Expand Down Expand Up @@ -66,7 +66,7 @@ Provider id : acedatacloud.acedatacloud
Server label: Ace Data Cloud Account MCP
Server URL : https://mcp.acedata.cloud/mcp
Transport : Streamable HTTP
Auth : Bearer API key from VS Code SecretStorage (or $ACEDATACLOUD_PLATFORM_TOKEN)
Auth : Bearer account token from VS Code SecretStorage (or $ACEDATACLOUD_PLATFORM_TOKEN)
```

You don't need to edit `mcp.json` — the extension handles registration and
Expand Down
16 changes: 8 additions & 8 deletions acedatacloud/vscode/extension.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ const CLEAR_TOKEN_CMD = "acedatacloud.acedatacloud.clearApiToken";
// Per-extension SecretStorage namespace; we keep one key per service so
// rotating one API key doesn't affect siblings.
const SECRET_KEY = "acedatacloud.apiToken";
const SIGNUP_URL = "https://platform.acedata.cloud";
const CREDENTIAL_URL = "https://platform.acedata.cloud/console/platform-tokens?utm_source=vscode&utm_medium=referral&utm_campaign=evergreen&utm_content=acedatacloud_mcp_extension_platform_token";

async function readToken(context) {
const env = process.env.ACEDATACLOUD_PLATFORM_TOKEN;
Expand All @@ -32,9 +32,9 @@ async function readToken(context) {

async function promptForToken(context) {
const token = await vscode.window.showInputBox({
title: `${SERVER_LABEL} — Ace Data Cloud API key`,
prompt: `Paste an API key from ${SIGNUP_URL}/console/applications (Applications -> API Key). Stored in the OS keychain.`,
placeHolder: "API key from /console/applications",
title: `${SERVER_LABEL} — Ace Data Cloud platform token`,
prompt: `Paste an Ace Data Cloud platform token from ${CREDENTIAL_URL}. Stored in VS Code SecretStorage.`,
placeHolder: "Platform Token from /console/platform-tokens",
password: true,
ignoreFocusOut: true,
});
Expand All @@ -53,13 +53,13 @@ function activate(context) {
vscode.commands.registerCommand(SET_TOKEN_CMD, async () => {
const t = await promptForToken(context);
if (t) {
vscode.window.showInformationMessage(`${SERVER_LABEL}: API key saved.`);
vscode.window.showInformationMessage(`${SERVER_LABEL}: platform token saved.`);
onDidChange.fire();
}
}),
vscode.commands.registerCommand(CLEAR_TOKEN_CMD, async () => {
await context.secrets.delete(SECRET_KEY);
vscode.window.showInformationMessage(`${SERVER_LABEL}: API key cleared.`);
vscode.window.showInformationMessage(`${SERVER_LABEL}: platform token cleared.`);
onDidChange.fire();
}),
context.secrets.onDidChange((e) => {
Expand All @@ -75,8 +75,8 @@ function activate(context) {
if (!token) token = await promptForToken(context);
if (!token) {
throw new Error(
`${SERVER_LABEL} needs an Ace Data Cloud API key. ` +
`Run "${SERVER_LABEL}: Set Ace Data Cloud API Key" from the command palette.`
`${SERVER_LABEL} needs an Ace Data Cloud platform token. ` +
`Run "${SERVER_LABEL}: Set Ace Data Cloud Platform Token" from the command palette.`
);
}
return new vscode.McpHttpServerDefinition(server.label, server.uri, {
Expand Down
4 changes: 2 additions & 2 deletions acedatacloud/vscode/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,12 @@
"commands": [
{
"command": "acedatacloud.acedatacloud.setApiToken",
"title": "Ace Data Cloud Account MCP: Set Ace Data Cloud API Key",
"title": "Ace Data Cloud Account MCP: Set Ace Data Cloud Platform Token",
"category": "MCP"
},
{
"command": "acedatacloud.acedatacloud.clearApiToken",
"title": "Ace Data Cloud Account MCP: Clear Ace Data Cloud API Key",
"title": "Ace Data Cloud Account MCP: Clear Ace Data Cloud Platform Token",
"category": "MCP"
}
]
Expand Down
4 changes: 3 additions & 1 deletion face/vscode/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ can call it directly from chat.

1. **Install this extension.** VS Code registers the `face` MCP server automatically.
2. **Get an application API key** using the detailed steps below. Check service access and your current balance before the first request.
3. **Open Copilot Chat** in agent mode and ask for an image task — the extension prompts for the API key the first time and stores it in the OS keychain via VS Code's `SecretStorage`.
3. **Select a model with tool calling in VS Code Chat.** You can use your existing model, or install [Ace Data Cloud Chat Models](https://marketplace.visualstudio.com/items?itemName=acedatacloud.chat-models). For the Ace model, first follow its [setup guide](https://github.com/AceDataCloud/VSCodeModelProvider#4-show-the-model-in-chat), open **Chat: Manage Language Models**, make the model visible, and select it in Chat. BYOK Chat does not require GitHub sign-in or a Copilot plan; organization policies still apply.
4. **Enable this server's tools.** Open **Chat → Agent → Configure Tools** and select only the tools you need under **Face Transform MCP**. If the list is empty, choose **Update Tools**. The extension prompts for the API key on first use and saves it in VS Code's `SecretStorage`. Disable another copy of the same server from the Ace MCP bundle or manual `mcp.json` to avoid duplicate tools.
5. **Verify one result.** Check the Tool Reference below and current pricing before running a request. If you already have a task ID, enable its task-query tool and query that same ID first. An accepted generation is not a completed result: poll the original task until it reaches a successful terminal state, open the returned media, and match the task ID in [Usage](https://platform.acedata.cloud/console/usage?utm_source=vscode_marketplace&utm_medium=referral&utm_campaign=evergreen&utm_content=face_mcp_vscode_console_usage). Do not resubmit generation to poll. Model Chat and background utility calls can add separate charges to the service request.

You can rotate or remove the API key any time from the command palette:

Expand Down
16 changes: 8 additions & 8 deletions face/vscode/extension.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ const CLEAR_TOKEN_CMD = "acedatacloud.face.clearApiToken";
// Per-extension SecretStorage namespace; we keep one key per service so
// rotating one API key doesn't affect siblings.
const SECRET_KEY = "face.apiToken";
const SIGNUP_URL = "https://platform.acedata.cloud";
const CREDENTIAL_URL = "https://platform.acedata.cloud/console/applications?utm_source=vscode&utm_medium=referral&utm_campaign=evergreen&utm_content=face_mcp_extension_api_key";

async function readToken(context) {
const env = process.env.ACEDATACLOUD_API_TOKEN;
Expand All @@ -32,9 +32,9 @@ async function readToken(context) {

async function promptForToken(context) {
const token = await vscode.window.showInputBox({
title: `${SERVER_LABEL} — Ace Data Cloud API key`,
prompt: `Paste an API key from ${SIGNUP_URL}/console/applications (Applications -> API Key). Stored in the OS keychain.`,
placeHolder: "API key from /console/applications",
title: `${SERVER_LABEL} — Ace Data Cloud api key`,
prompt: `Paste an Ace Data Cloud api key from ${CREDENTIAL_URL}. Stored in VS Code SecretStorage.`,
placeHolder: "API Key from /console/applications",
password: true,
ignoreFocusOut: true,
});
Expand All @@ -53,13 +53,13 @@ function activate(context) {
vscode.commands.registerCommand(SET_TOKEN_CMD, async () => {
const t = await promptForToken(context);
if (t) {
vscode.window.showInformationMessage(`${SERVER_LABEL}: API key saved.`);
vscode.window.showInformationMessage(`${SERVER_LABEL}: api key saved.`);
onDidChange.fire();
}
}),
vscode.commands.registerCommand(CLEAR_TOKEN_CMD, async () => {
await context.secrets.delete(SECRET_KEY);
vscode.window.showInformationMessage(`${SERVER_LABEL}: API key cleared.`);
vscode.window.showInformationMessage(`${SERVER_LABEL}: api key cleared.`);
onDidChange.fire();
}),
context.secrets.onDidChange((e) => {
Expand All @@ -75,8 +75,8 @@ function activate(context) {
if (!token) token = await promptForToken(context);
if (!token) {
throw new Error(
`${SERVER_LABEL} needs an Ace Data Cloud API key. ` +
`Run "${SERVER_LABEL}: Set Ace Data Cloud API Key" from the command palette.`
`${SERVER_LABEL} needs an Ace Data Cloud api key. ` +
`Run "${SERVER_LABEL}: Set Ace Data Cloud API Key" from the command palette.`
);
}
return new vscode.McpHttpServerDefinition(server.label, server.uri, {
Expand Down
4 changes: 3 additions & 1 deletion fish/vscode/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ can call it directly from chat.

1. **Install this extension.** VS Code registers the `fish` MCP server automatically.
2. **Get an application API key** using the detailed steps below. Check service access and your current balance before the first request.
3. **Open Copilot Chat** in agent mode and ask for an audio task — the extension prompts for the API key the first time and stores it in the OS keychain via VS Code's `SecretStorage`.
3. **Select a model with tool calling in VS Code Chat.** You can use your existing model, or install [Ace Data Cloud Chat Models](https://marketplace.visualstudio.com/items?itemName=acedatacloud.chat-models). For the Ace model, first follow its [setup guide](https://github.com/AceDataCloud/VSCodeModelProvider#4-show-the-model-in-chat), open **Chat: Manage Language Models**, make the model visible, and select it in Chat. BYOK Chat does not require GitHub sign-in or a Copilot plan; organization policies still apply.
4. **Enable this server's tools.** Open **Chat → Agent → Configure Tools** and select only the tools you need under **Fish Audio MCP**. If the list is empty, choose **Update Tools**. The extension prompts for the API key on first use and saves it in VS Code's `SecretStorage`. Disable another copy of the same server from the Ace MCP bundle or manual `mcp.json` to avoid duplicate tools.
5. **Verify one result.** Check the Tool Reference below and current pricing before running a request. If you already have a task ID, enable its task-query tool and query that same ID first. An accepted generation is not a completed result: poll the original task until it reaches a successful terminal state, open the returned media, and match the task ID in [Usage](https://platform.acedata.cloud/console/usage?utm_source=vscode_marketplace&utm_medium=referral&utm_campaign=evergreen&utm_content=fish_mcp_vscode_console_usage). Do not resubmit generation to poll. Model Chat and background utility calls can add separate charges to the service request.

You can rotate or remove the API key any time from the command palette:

Expand Down
16 changes: 8 additions & 8 deletions fish/vscode/extension.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ const CLEAR_TOKEN_CMD = "acedatacloud.fish.clearApiToken";
// Per-extension SecretStorage namespace; we keep one key per service so
// rotating one API key doesn't affect siblings.
const SECRET_KEY = "fish.apiToken";
const SIGNUP_URL = "https://platform.acedata.cloud";
const CREDENTIAL_URL = "https://platform.acedata.cloud/console/applications?utm_source=vscode&utm_medium=referral&utm_campaign=evergreen&utm_content=fish_mcp_extension_api_key";

async function readToken(context) {
const env = process.env.ACEDATACLOUD_API_TOKEN;
Expand All @@ -32,9 +32,9 @@ async function readToken(context) {

async function promptForToken(context) {
const token = await vscode.window.showInputBox({
title: `${SERVER_LABEL} — Ace Data Cloud API key`,
prompt: `Paste an API key from ${SIGNUP_URL}/console/applications (Applications -> API Key). Stored in the OS keychain.`,
placeHolder: "API key from /console/applications",
title: `${SERVER_LABEL} — Ace Data Cloud api key`,
prompt: `Paste an Ace Data Cloud api key from ${CREDENTIAL_URL}. Stored in VS Code SecretStorage.`,
placeHolder: "API Key from /console/applications",
password: true,
ignoreFocusOut: true,
});
Expand All @@ -53,13 +53,13 @@ function activate(context) {
vscode.commands.registerCommand(SET_TOKEN_CMD, async () => {
const t = await promptForToken(context);
if (t) {
vscode.window.showInformationMessage(`${SERVER_LABEL}: API key saved.`);
vscode.window.showInformationMessage(`${SERVER_LABEL}: api key saved.`);
onDidChange.fire();
}
}),
vscode.commands.registerCommand(CLEAR_TOKEN_CMD, async () => {
await context.secrets.delete(SECRET_KEY);
vscode.window.showInformationMessage(`${SERVER_LABEL}: API key cleared.`);
vscode.window.showInformationMessage(`${SERVER_LABEL}: api key cleared.`);
onDidChange.fire();
}),
context.secrets.onDidChange((e) => {
Expand All @@ -75,8 +75,8 @@ function activate(context) {
if (!token) token = await promptForToken(context);
if (!token) {
throw new Error(
`${SERVER_LABEL} needs an Ace Data Cloud API key. ` +
`Run "${SERVER_LABEL}: Set Ace Data Cloud API Key" from the command palette.`
`${SERVER_LABEL} needs an Ace Data Cloud api key. ` +
`Run "${SERVER_LABEL}: Set Ace Data Cloud API Key" from the command palette.`
);
}
return new vscode.McpHttpServerDefinition(server.label, server.uri, {
Expand Down
4 changes: 3 additions & 1 deletion flux/vscode/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@ can call it directly from chat.

1. **Install this extension.** VS Code registers the `flux` MCP server automatically.
2. **Get an application API key** using the detailed steps below. Check service access and your current balance before the first request.
3. **Open Copilot Chat** in agent mode and ask for a image task — the extension prompts for the API key the first time and stores it in the OS keychain via VS Code's `SecretStorage`.
3. **Select a model with tool calling in VS Code Chat.** You can use your existing model, or install [Ace Data Cloud Chat Models](https://marketplace.visualstudio.com/items?itemName=acedatacloud.chat-models). For the Ace model, first follow its [setup guide](https://github.com/AceDataCloud/VSCodeModelProvider#4-show-the-model-in-chat), open **Chat: Manage Language Models**, make the model visible, and select it in Chat. BYOK Chat does not require GitHub sign-in or a Copilot plan; organization policies still apply.
4. **Enable this server's tools.** Open **Chat → Agent → Configure Tools** and select only the tools you need under **Flux MCP**. If the list is empty, choose **Update Tools**. The extension prompts for the API key on first use and saves it in VS Code's `SecretStorage`. Disable another copy of the same server from the Ace MCP bundle or manual `mcp.json` to avoid duplicate tools.
5. **Verify one result.** Check the Tool Reference below and current pricing before running a request. If you already have a task ID, enable its task-query tool and query that same ID first. An accepted generation is not a completed result: poll the original task until it reaches a successful terminal state, open the returned media, and match the task ID in [Usage](https://platform.acedata.cloud/console/usage?utm_source=vscode_marketplace&utm_medium=referral&utm_campaign=evergreen&utm_content=flux_mcp_vscode_console_usage). Do not resubmit generation to poll. Model Chat and background utility calls can add separate charges to the service request.

You can rotate or remove the API key any time from the command palette:

Expand Down
14 changes: 7 additions & 7 deletions flux/vscode/extension.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ const CLEAR_TOKEN_CMD = "acedatacloud.flux.clearApiToken";
// Per-extension SecretStorage namespace; we keep one key per service so
// rotating one API key doesn't affect siblings.
const SECRET_KEY = "flux.apiToken";
const SIGNUP_URL = "https://platform.acedata.cloud";
const CREDENTIAL_URL = "https://platform.acedata.cloud/console/applications?utm_source=vscode&utm_medium=referral&utm_campaign=evergreen&utm_content=flux_mcp_extension_api_key";

async function readToken(context) {
const env = process.env.ACEDATACLOUD_API_TOKEN;
Expand All @@ -32,9 +32,9 @@ async function readToken(context) {

async function promptForToken(context) {
const token = await vscode.window.showInputBox({
title: `${SERVER_LABEL} — Ace Data Cloud API key`,
prompt: `Paste an API key from ${SIGNUP_URL}/console/applications (Applications -> API Key). Stored in the OS keychain.`,
placeHolder: "API key from /console/applications",
title: `${SERVER_LABEL} — Ace Data Cloud api key`,
prompt: `Paste an Ace Data Cloud api key from ${CREDENTIAL_URL}. Stored in VS Code SecretStorage.`,
placeHolder: "API Key from /console/applications",
password: true,
ignoreFocusOut: true,
});
Expand All @@ -53,13 +53,13 @@ function activate(context) {
vscode.commands.registerCommand(SET_TOKEN_CMD, async () => {
const t = await promptForToken(context);
if (t) {
vscode.window.showInformationMessage(`${SERVER_LABEL}: API key saved.`);
vscode.window.showInformationMessage(`${SERVER_LABEL}: api key saved.`);
onDidChange.fire();
}
}),
vscode.commands.registerCommand(CLEAR_TOKEN_CMD, async () => {
await context.secrets.delete(SECRET_KEY);
vscode.window.showInformationMessage(`${SERVER_LABEL}: API key cleared.`);
vscode.window.showInformationMessage(`${SERVER_LABEL}: api key cleared.`);
onDidChange.fire();
}),
context.secrets.onDidChange((e) => {
Expand All @@ -75,7 +75,7 @@ function activate(context) {
if (!token) token = await promptForToken(context);
if (!token) {
throw new Error(
`${SERVER_LABEL} needs an Ace Data Cloud API key. ` +
`${SERVER_LABEL} needs an Ace Data Cloud api key. ` +
`Run "${SERVER_LABEL}: Set Ace Data Cloud API Key" from the command palette.`
);
}
Expand Down
Loading
Loading