@superglue/cli 1.1.25 → 1.1.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +12 -0
- package/dist/cli.js +471 -123
- package/dist/skills/superglue/SKILL.md +74 -27
- package/dist/skills/superglue/references/access-rules.md +38 -98
- package/dist/skills/superglue/references/http.md +3 -0
- package/dist/skills/superglue/references/odbc.md +39 -9
- package/dist/skills/superglue/references/superglue-info.md +25 -19
- package/package.json +1 -1
- package/skills/superglue/SKILL.md +74 -27
- package/skills/superglue/references/access-rules.md +38 -98
- package/skills/superglue/references/http.md +3 -0
- package/skills/superglue/references/odbc.md +39 -9
- package/skills/superglue/references/superglue-info.md +25 -19
|
@@ -25,7 +25,7 @@ Read these on demand — they are authoritative for their topic and kept in sync
|
|
|
25
25
|
| `sg skill redis` | Redis command syntax, connection URLs, key type handling |
|
|
26
26
|
| `sg skill sftp-smb` | SFTP, FTP, and SMB operations, file upload/download semantics, path handling |
|
|
27
27
|
| `sg skill file-handling` | File detection, parsing, `file::` reference syntax, lazy base64 access, transform-produced files |
|
|
28
|
-
| `sg skill access-rules` | RBAC roles
|
|
28
|
+
| `sg skill access-rules` | RBAC roles and binary tool/system allowlists (enterprise only) |
|
|
29
29
|
|
|
30
30
|
## CRITICAL RULES — READ FIRST
|
|
31
31
|
|
|
@@ -33,7 +33,7 @@ Read these on demand — they are authoritative for their topic and kept in sync
|
|
|
33
33
|
|
|
34
34
|
1. **Check CLI exists**: Run `sg --version`. If it fails with `command not found`, install: `npm install -g @superglue/cli`.
|
|
35
35
|
2. **Keep CLI and SDK up to date**: Always use the latest versions. Run `sg update` to update the CLI. For the SDK, run `npm install @superglue/client@latest` (JS) or `pip install --upgrade superglue-client` (Python).
|
|
36
|
-
3. **Verify configuration**: Run `sg system list`. If it fails with `fetch failed` or auth errors, the CLI needs configuration via `sg init` (see Setup below).
|
|
36
|
+
3. **Verify configuration**: Run `sg system list`. If it fails with `fetch failed` or auth errors, the CLI needs configuration via `sg init` (see Setup below). For custom/self-hosted instances, the CLI must know both the instance API endpoint and an org-scoped API key.
|
|
37
37
|
|
|
38
38
|
**Calling systems and running tools**
|
|
39
39
|
|
|
@@ -103,11 +103,11 @@ Verify with `sg system list` — should return a list (possibly empty) without e
|
|
|
103
103
|
|
|
104
104
|
Set during `sg init` or via `SUPERGLUE_CLI_PRESET` env var. Stored in `config.json` as `"preset"`.
|
|
105
105
|
|
|
106
|
-
| Preset | Description
|
|
107
|
-
| --------- |
|
|
108
|
-
| `runner` | Run saved tools by ID only. Read-only lookups. No building/editing
|
|
109
|
-
| `builder` | Runner + build/edit/save tools, call systems. No system CRUD
|
|
110
|
-
| `admin` | Full access (default)
|
|
106
|
+
| Preset | Description |
|
|
107
|
+
| --------- | -------------------------------------------------------------------------------- |
|
|
108
|
+
| `runner` | Run saved tools by ID only. Read-only lookups. No building/editing |
|
|
109
|
+
| `builder` | Runner + build/edit/save tools, call systems, manage MCP servers. No system CRUD |
|
|
110
|
+
| `admin` | Full access (default) |
|
|
111
111
|
|
|
112
112
|
Blocked commands print a clear error showing the current preset and how to change it.
|
|
113
113
|
|
|
@@ -147,9 +147,10 @@ Blocked commands print a clear error showing the current preset and how to chang
|
|
|
147
147
|
|
|
148
148
|
1. Search for an existing system first: `sg system find <query>`
|
|
149
149
|
2. If creating: `sg system create --name "..." --url "..." --credentials '{...}'`. Prefer `--template <id>` when one exists — it auto-fills URL and OAuth config
|
|
150
|
-
3. For OAuth: `sg system oauth --system-id <id> --scopes "..."` opens a browser flow. User approves → tokens saved automatically
|
|
151
|
-
4.
|
|
152
|
-
5.
|
|
150
|
+
3. For OAuth: `sg system oauth --system-id <id> [--scopes "..."]` opens a browser flow. User approves → tokens saved automatically
|
|
151
|
+
4. For user-owned non-OAuth credentials: `sg system credentials set --system-id <id> --credentials '{...}'`
|
|
152
|
+
5. Verify connectivity with `sg system call`
|
|
153
|
+
6. For updates: `sg system edit --id <id>` with the fields to change
|
|
153
154
|
|
|
154
155
|
### Running a Tool (Ad-hoc)
|
|
155
156
|
|
|
@@ -160,6 +161,30 @@ sg tool run --draft <draftId> --payload-file payload.json
|
|
|
160
161
|
|
|
161
162
|
Streams live execution logs to the terminal. Use `--include-step-results` for raw per-step responses and `--include-config` for the full config dump.
|
|
162
163
|
|
|
164
|
+
### Creating/Editing a Named MCP Server
|
|
165
|
+
|
|
166
|
+
Named MCP servers expose a selected set of saved tools through an MCP endpoint. The CLI always uses the configured superglue API endpoint, so it works for Cloud and self-hosted instances when `SUPERGLUE_API_ENDPOINT` or `--endpoint` points at the right API.
|
|
167
|
+
|
|
168
|
+
1. Verify CLI setup: `sg system list` or `sg mcp list`
|
|
169
|
+
2. Find saved tools to expose: `sg tool list` or `sg tool find <query>`
|
|
170
|
+
3. Create the server:
|
|
171
|
+
```bash
|
|
172
|
+
sg mcp create --name sales-tools --tool get_customer --tool create_invoice
|
|
173
|
+
```
|
|
174
|
+
4. Use the returned `server.connection.endpoint` and `clientConfig` in the MCP client.
|
|
175
|
+
5. Edit later with:
|
|
176
|
+
```bash
|
|
177
|
+
sg mcp edit --id <serverId> --add-tool another_tool
|
|
178
|
+
sg mcp edit --id <serverId> --tools get_customer,create_invoice
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Auth modes:
|
|
182
|
+
|
|
183
|
+
- `oauth` (default): OAuth-capable MCP clients authenticate users through the MCP auth flow.
|
|
184
|
+
- `creator_api_key`: private/headless clients must send `Authorization: Bearer <SUPERGLUE_API_KEY>` where the key is active and assigned to the MCP server creator.
|
|
185
|
+
|
|
186
|
+
If `sg mcp ...` returns "MCP server management is not available", the target instance or plan does not support named MCP server management. The default all-tools MCP endpoint may still be usable at `<api-endpoint>/mcp`.
|
|
187
|
+
|
|
163
188
|
---
|
|
164
189
|
|
|
165
190
|
## Reference
|
|
@@ -168,23 +193,27 @@ Streams live execution logs to the terminal. Use `--include-step-results` for ra
|
|
|
168
193
|
|
|
169
194
|
Agents familiar with the web tool names can map them directly to CLI commands:
|
|
170
195
|
|
|
171
|
-
| Web agent tool
|
|
172
|
-
|
|
|
173
|
-
| `build_tool`
|
|
174
|
-
| `edit_tool`
|
|
175
|
-
| `run_tool`
|
|
176
|
-
| `save_tool`
|
|
177
|
-
| `
|
|
178
|
-
| `create_system`
|
|
179
|
-
| `edit_system`
|
|
180
|
-
| `
|
|
181
|
-
|
|
|
182
|
-
| `
|
|
183
|
-
| `
|
|
184
|
-
| `
|
|
185
|
-
|
|
|
186
|
-
|
|
187
|
-
|
|
196
|
+
| Web agent tool | CLI command | Notes |
|
|
197
|
+
| ------------------------------------------------ | --------------------------------------------- | ------------------------------------------------------------------ |
|
|
198
|
+
| `build_tool` | `sg tool build --config '{...}'` | CLI is not AI-powered — you provide the full JSON config |
|
|
199
|
+
| `edit_tool` | `sg tool edit --tool <id> --patches '[...]'` | JSON Patch (RFC 6902). Use `--draft <id>` for drafts |
|
|
200
|
+
| `run_tool` | `sg tool run --tool <id>` / `--draft <id>` | Add `--include-step-results` to inspect per-step data |
|
|
201
|
+
| `save_tool` | `sg tool save --draft <draftId>` | Persists a draft to the database |
|
|
202
|
+
| `run_command` with `vfs` for `/org/tools/` | `sg tool find --id <id>` / `sg tool find <q>` | Full config with `--id`, compact search with a query string |
|
|
203
|
+
| `create_system` | `sg system create --name "..." --url "..."` | Use `--template <id>` when available |
|
|
204
|
+
| `edit_system` | `sg system edit --id <id> ...` | Supports `--env dev\|prod` |
|
|
205
|
+
| `run_command` with `vfs` for `/org/systems/` | `sg system find <query>` / `--id <id>` | Returns `storedCredentials` and system URL |
|
|
206
|
+
| Credentials VFS / user-owned credentials | `sg system credentials get/set/clear` | Manage current user's credentials for user-owned systems |
|
|
207
|
+
| `call_system` | `sg system call --url "..." --system-id <id>` | Authenticated ad-hoc calls for testing / schema introspection |
|
|
208
|
+
| `run_command search` | `sg system search-docs --system-id <id> -k` | Targeted keyword search over ingested system docs |
|
|
209
|
+
| `authenticate_oauth` | `sg system oauth --system-id <id> [--scopes]` | Opens browser flow. Supports `--grant-type client_credentials` too |
|
|
210
|
+
| `run_command` with `vfs` for `/org/runs/` | `sg run list` / `sg run get <runId>` | Filter `list` by `--tool`, `--status`, `--source`, `--limit` |
|
|
211
|
+
| `run_command` with `vfs` for `/org/mcp-servers/` | `sg mcp list` / `sg mcp find --id <id>` | Returns endpoint, auth mode, selected tool IDs, and client config |
|
|
212
|
+
| `create_mcp_server` | `sg mcp create --name <n> --tool <id>` | Creates a named MCP endpoint for selected saved tools |
|
|
213
|
+
| `edit_mcp_server` | `sg mcp edit --id <id> ...` | Edits name, auth mode, description, or selected tool IDs |
|
|
214
|
+
| (no direct equivalent) | `sg init`, `sg update`, `sg skill` | CLI-specific setup, updater, and this reference system |
|
|
215
|
+
|
|
216
|
+
Web-agent-only concepts with no CLI equivalent: `run_command`'s virtual filesystem (CLI uses concrete `sg` subcommands), `create_schedule`/`edit_schedule` (manage schedules via web app or REST API), `authenticate_oauth`'s dedicated MCP `authenticate` tool (CLI uses `sg system oauth`).
|
|
188
217
|
|
|
189
218
|
### Command Reference
|
|
190
219
|
|
|
@@ -215,6 +244,9 @@ sg system edit --id my_api --credentials '{...}'
|
|
|
215
244
|
sg system list
|
|
216
245
|
sg system find slack
|
|
217
246
|
sg system find --id my_api --env dev
|
|
247
|
+
sg system credentials get --system-id my_api
|
|
248
|
+
sg system credentials set --system-id my_api --credentials '{"api_key":"sk-xxx"}'
|
|
249
|
+
sg system credentials clear --system-id my_api
|
|
218
250
|
sg system call --url https://api.example.com/users --system-id my_api --method GET \
|
|
219
251
|
--headers '{"Authorization":"Bearer <<my_api_access_token>>"}'
|
|
220
252
|
sg system search-docs --system-id slack -k "send message channels"
|
|
@@ -222,6 +254,19 @@ sg system oauth --system-id gmail --scopes "https://www.googleapis.com/auth/gmai
|
|
|
222
254
|
sg system oauth --system-id my_api --grant-type client_credentials --scopes "read write"
|
|
223
255
|
```
|
|
224
256
|
|
|
257
|
+
**MCP server commands:**
|
|
258
|
+
|
|
259
|
+
```bash
|
|
260
|
+
sg mcp list
|
|
261
|
+
sg mcp find sales
|
|
262
|
+
sg mcp find --id <serverId>
|
|
263
|
+
sg mcp create --name sales-tools --tool get_customer --tool create_invoice
|
|
264
|
+
sg mcp create --name sales-tools --tools get_customer,create_invoice --auth-mode oauth
|
|
265
|
+
sg mcp edit --id <serverId> --add-tool another_tool
|
|
266
|
+
sg mcp edit --id <serverId> --remove-tool old_tool
|
|
267
|
+
sg mcp edit --id <serverId> --auth-mode creator_api_key
|
|
268
|
+
```
|
|
269
|
+
|
|
225
270
|
**Run commands:**
|
|
226
271
|
|
|
227
272
|
```bash
|
|
@@ -437,6 +482,8 @@ Basic auth auto-encodes: if the value after `Basic ` isn't already base64, the e
|
|
|
437
482
|
**Credential lifecycle:**
|
|
438
483
|
|
|
439
484
|
- Pass ALL credentials (including secrets) via `--credentials '{"api_key":"...","client_secret":"..."}'` on create/edit
|
|
485
|
+
- For user-owned systems, use `sg system credentials set --system-id <id> --credentials '{...}'` to save credentials for the current API-key user
|
|
486
|
+
- Use `sg system credentials get --system-id <id>` to inspect current-user credential keys; values are masked unless `--reveal` is passed
|
|
440
487
|
- OAuth tokens (`access_token`, `refresh_token`) auto-refresh before each step execution
|
|
441
488
|
- Non-sensitive fields (`client_id`, `auth_url`, `token_url`) are stored alongside secrets in the same `--credentials` JSON
|
|
442
489
|
|
|
@@ -1,137 +1,77 @@
|
|
|
1
1
|
# Access Rules (RBAC)
|
|
2
2
|
|
|
3
|
-
On superglue, roles define tool-level and system-level allowlists. Users can have multiple roles. Roles and access rules are only available on enterprise organizations.
|
|
3
|
+
On superglue, roles define binary tool-level and system-level allowlists. Users can have multiple roles. Roles and access rules are only available on enterprise organizations.
|
|
4
4
|
|
|
5
5
|
## Data Model
|
|
6
6
|
|
|
7
|
-
### Role
|
|
8
|
-
|
|
9
7
|
```typescript
|
|
10
8
|
interface Role {
|
|
11
9
|
id: string;
|
|
12
10
|
name: string;
|
|
13
11
|
description?: string;
|
|
14
|
-
tools: "ALL" | string[];
|
|
15
|
-
systems: "ALL" |
|
|
16
|
-
isBaseRole?: boolean;
|
|
17
|
-
}
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
### SystemPermission
|
|
21
|
-
|
|
22
|
-
Each system entry is either a predefined access level or a custom rule:
|
|
23
|
-
|
|
24
|
-
```typescript
|
|
25
|
-
type SystemPermission = SystemAccessLevel | { rules: CustomRule[] };
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
| Type | Meaning |
|
|
29
|
-
| ------------------ | ------------------------------------------------ |
|
|
30
|
-
| `"read-write"` | All HTTP methods allowed |
|
|
31
|
-
| `"read-only"` | Only GET and HEAD; POST/PUT/PATCH/DELETE blocked |
|
|
32
|
-
| `{ rules: [...] }` | Custom JS expressions that gate access |
|
|
33
|
-
|
|
34
|
-
Systems not listed in the role's `systems` map are DENIED, unless the system access is set to `"ALL"`.
|
|
35
|
-
|
|
36
|
-
### CustomRule
|
|
37
|
-
|
|
38
|
-
```typescript
|
|
39
|
-
interface CustomRule {
|
|
40
|
-
id: string;
|
|
41
|
-
name: string;
|
|
42
|
-
expression?: string; // JS expression, receives stepConfig
|
|
43
|
-
isActive: boolean;
|
|
12
|
+
tools: "ALL" | string[];
|
|
13
|
+
systems: "ALL" | string[];
|
|
14
|
+
isBaseRole?: boolean;
|
|
44
15
|
}
|
|
45
16
|
```
|
|
46
17
|
|
|
47
|
-
|
|
18
|
+
Only `"ALL"` means open access. Empty arrays, missing fields, or `null` mean no direct access from that role.
|
|
48
19
|
|
|
49
20
|
## Tool Permissions
|
|
50
21
|
|
|
51
22
|
- `tools: "ALL"` — every tool is allowed, including tools created in the future
|
|
52
|
-
- `tools: ["tool-id-1", "tool-id-2"]` — only these specific tools are allowed
|
|
23
|
+
- `tools: ["tool-id-1", "tool-id-2"]` — only these specific tools are allowed
|
|
24
|
+
- Effective tool visibility also requires access to every system referenced by that tool's request steps
|
|
53
25
|
|
|
54
26
|
## System Permissions
|
|
55
27
|
|
|
56
|
-
- `systems: "ALL"` — every
|
|
57
|
-
- `systems:
|
|
58
|
-
-
|
|
28
|
+
- `systems: "ALL"` — every current and future system is allowed
|
|
29
|
+
- `systems: ["gmail", "stripe"]` — only these specific systems are allowed
|
|
30
|
+
- System access is binary by system ID: listed means allowed, omitted means denied.
|
|
59
31
|
|
|
60
|
-
##
|
|
32
|
+
## Tool/System Entanglement
|
|
61
33
|
|
|
62
|
-
|
|
34
|
+
A saved tool is effectively visible and runnable only when both are true:
|
|
63
35
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
- **FTP / SMB** — operations other than `list`, `get`, `exists`, `stat` are mutating
|
|
67
|
-
- **Redis** — commands not in the read-only set (GET, MGET, EXISTS, KEYS, SCAN, TTL, TYPE, HGET, HGETALL, LRANGE, SMEMBERS, SCARD, etc.) are mutating
|
|
68
|
-
- **Transform** — never mutating (pure data transformation, no external system)
|
|
36
|
+
1. The user has tool access through at least one role.
|
|
37
|
+
2. The user has access to every `systemId` referenced by the tool's request steps.
|
|
69
38
|
|
|
70
|
-
|
|
39
|
+
When granting a tool, inspect the tool's request-step `systemId` values and grant required systems when the user should be able to see or run the tool.
|
|
71
40
|
|
|
72
|
-
##
|
|
73
|
-
|
|
74
|
-
Custom rules only apply in SPECIFIC mode. If systems is `"ALL"`, no custom rules exist.
|
|
75
|
-
|
|
76
|
-
Expressions receive a **resolved** `stepConfig` object — all template variables (`<<variable>>` and `<<(sourceData) => ...>>` expressions) are substituted with their actual runtime values before the rule evaluates. This means rules see the real URL, headers, body, and query params, not raw templates.
|
|
77
|
-
|
|
78
|
-
```typescript
|
|
79
|
-
interface StepConfig {
|
|
80
|
-
url: string;
|
|
81
|
-
method: string;
|
|
82
|
-
headers: Record<string, string>;
|
|
83
|
-
queryParams: Record<string, string>;
|
|
84
|
-
body: unknown;
|
|
85
|
-
systemId: string;
|
|
86
|
-
}
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
Example expressions:
|
|
90
|
-
|
|
91
|
-
```javascript
|
|
92
|
-
// Block all POST requests to a specific endpoint
|
|
93
|
-
stepConfig.method !== "POST" || !stepConfig.url.includes("/admin");
|
|
94
|
-
|
|
95
|
-
// Only allow GET requests to /api/v1/read endpoints
|
|
96
|
-
stepConfig.method === "GET" && stepConfig.url.includes("/api/v1/read");
|
|
41
|
+
## Multi-Role Semantics
|
|
97
42
|
|
|
98
|
-
|
|
99
|
-
!stepConfig.headers["x-dangerous-header"];
|
|
43
|
+
Users can have multiple roles. Resolution is union:
|
|
100
44
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
45
|
+
| Layer | Semantics |
|
|
46
|
+
| ------- | ----------------------------------------------------- |
|
|
47
|
+
| Tools | If any role allows a tool, the tool ID is allowed |
|
|
48
|
+
| Systems | If any role allows a system, the system ID is allowed |
|
|
104
49
|
|
|
105
|
-
|
|
50
|
+
Assigned roles can add access but cannot remove access granted by another role.
|
|
106
51
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
| Layer | Semantics | Example |
|
|
110
|
-
| ------------ | ------------------------------ | --------------------------------------------------------------------------- |
|
|
111
|
-
| Tools | Union (most permissive wins) | If role A allows tool X and role B doesn't, tool X is allowed |
|
|
112
|
-
| Systems | Union (most permissive wins) | If role A gives READ_ONLY and role B gives READ_WRITE, result is READ_WRITE |
|
|
113
|
-
| Custom rules | Per-role union (any role wins) | If any role's complete rule set allows the request, it goes through |
|
|
52
|
+
## Base Roles
|
|
114
53
|
|
|
115
|
-
|
|
54
|
+
Every user has exactly one base role:
|
|
116
55
|
|
|
117
|
-
-
|
|
118
|
-
-
|
|
56
|
+
- **`admin`** — full access to everything. The admin role is immutable.
|
|
57
|
+
- **`member`** — default for org team members. Starts with `tools: "ALL"`, `systems: "ALL"`. Tool and system allowlists can be narrowed. Name and description cannot be changed. Cannot be deleted.
|
|
119
58
|
|
|
120
|
-
|
|
59
|
+
Users can also have additional custom roles on top of their base role. Custom roles are fully editable and can be created/deleted.
|
|
121
60
|
|
|
122
|
-
|
|
61
|
+
## Personal Roles
|
|
123
62
|
|
|
124
|
-
|
|
125
|
-
- **`member`** — Default for org team members. Starts with `tools: "ALL"`, `systems: "ALL"`. Tool and system allowlists can be narrowed to restrict access. Name and description cannot be changed. Cannot be deleted.
|
|
126
|
-
- **`enduser`** — Default for end users / portal consumers. Starts with `tools: []`, `systems: {}` (no access). Tool and system allowlists must be explicitly populated to grant access. Name and description cannot be changed. Cannot be deleted.
|
|
63
|
+
Admins can create a personal role for a specific user. A personal role is a per-user override that grants individual tool and system access independent of shared roles.
|
|
127
64
|
|
|
128
|
-
|
|
65
|
+
- Each user can have at most one personal role.
|
|
66
|
+
- Personal roles use the same `tools` and `systems` allowlist structure.
|
|
67
|
+
- Personal role allowlists are unioned with the user's other roles.
|
|
68
|
+
- Managed via the Personal Roles tab in Access Rules or the REST API (`POST /v1/users/:userId/personal-role`).
|
|
129
69
|
|
|
130
|
-
|
|
70
|
+
## Auto-Append On Resource Creation
|
|
131
71
|
|
|
132
|
-
When a user creates a new tool or system, the backend automatically adds it to the
|
|
72
|
+
When a user creates a new tool or system, the backend automatically adds it to the creator's personal role:
|
|
133
73
|
|
|
134
|
-
- New tool created
|
|
135
|
-
- New system created
|
|
74
|
+
- New tool created -> appended to the creator's personal role `tools` list
|
|
75
|
+
- New system created -> appended to the creator's personal role `systems` list
|
|
136
76
|
|
|
137
|
-
This only affects the
|
|
77
|
+
This only affects the creator's personal role, not base roles or additional custom roles.
|
|
@@ -29,6 +29,9 @@ All fields support `<<variable>>` and `<<(sourceData) => ...>>` expressions.
|
|
|
29
29
|
| `pagination` | no | See Pagination section |
|
|
30
30
|
| `systemId` | no | Links system credentials and URL. Omit for public APIs |
|
|
31
31
|
|
|
32
|
+
For APIs that require the same query key multiple times, use an array value:
|
|
33
|
+
`{ metadataHeaders: ["From", "Subject"] }` -> `?metadataHeaders=From&metadataHeaders=Subject`.
|
|
34
|
+
|
|
32
35
|
## Authentication
|
|
33
36
|
|
|
34
37
|
Credentials are never injected automatically. You must place auth headers explicitly using `<<systemId_credentialKey>>` syntax.
|
|
@@ -34,9 +34,9 @@ The path contains the **database name**. The ODBC driver is specified via the `D
|
|
|
34
34
|
|
|
35
35
|
**Supported drivers:**
|
|
36
36
|
|
|
37
|
-
| Driver | Database
|
|
38
|
-
| --------- |
|
|
39
|
-
| `FreeTDS` | SAP ASE (Sybase), SQL Server | 5000 |
|
|
37
|
+
| Driver | Database | Default Port |
|
|
38
|
+
| --------- | ------------------------------------------ | ------------ |
|
|
39
|
+
| `FreeTDS` | SAP ASE (Sybase), SQL Anywhere, SQL Server | 5000 |
|
|
40
40
|
|
|
41
41
|
Additional query parameters (beyond `DRIVER`) are passed through to the ODBC connection string as key=value pairs.
|
|
42
42
|
|
|
@@ -136,11 +136,41 @@ FreeTDS defaults to TDS 5.0 for Sybase connections. If you encounter protocol er
|
|
|
136
136
|
odbc://user:pass@host:5000/mydb?DRIVER=FreeTDS&TDS_Version=5.0
|
|
137
137
|
```
|
|
138
138
|
|
|
139
|
-
| TDS Version | Use Case
|
|
140
|
-
| ----------- |
|
|
141
|
-
| `5.0` | SAP ASE / Sybase
|
|
142
|
-
| `7.0` | SQL Server 7.0+
|
|
143
|
-
| `7.4` | SQL Server 2012+
|
|
139
|
+
| TDS Version | Use Case |
|
|
140
|
+
| ----------- | ---------------------------------- |
|
|
141
|
+
| `5.0` | SAP ASE / Sybase, SAP SQL Anywhere |
|
|
142
|
+
| `7.0` | SQL Server 7.0+ |
|
|
143
|
+
| `7.4` | SQL Server 2012+ |
|
|
144
|
+
|
|
145
|
+
### SAP SQL Anywhere
|
|
146
|
+
|
|
147
|
+
SQL Anywhere (SA16/SA17) works with FreeTDS using TDS version 5.0. Always specify `TDS_Version=5.0` explicitly:
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
odbc://user:pass@host:2638/mydb?DRIVER=FreeTDS&TDS_Version=5.0
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Key differences from SAP ASE:
|
|
154
|
+
|
|
155
|
+
- Default port is **2638** (not 5000)
|
|
156
|
+
- Uses `TOP n` instead of `SET ROWCOUNT n` for row limiting: `SELECT TOP 10 * FROM table`
|
|
157
|
+
- Does not support `LIMIT` syntax
|
|
158
|
+
- `DB_NAME()` returns the current database name
|
|
159
|
+
- `sa_db_info()` lists all running databases on the server
|
|
160
|
+
- Only databases explicitly loaded by the server process are available — if you get "database not found", the database name must match the logical name the server assigned at startup (either from `-n` flag or the `.db` filename without extension)
|
|
161
|
+
|
|
162
|
+
### Database-Specific Error Codes
|
|
163
|
+
|
|
164
|
+
ODBC often surfaces error codes from the underlying database or driver. Do not treat those codes as generic ODBC meanings. If the message identifies a database engine, use that vendor's SQLCODE documentation instead of inferring from connection-string shape.
|
|
165
|
+
|
|
166
|
+
For SQL Anywhere errors surfaced through ODBC:
|
|
167
|
+
|
|
168
|
+
| SQLCODE | Meaning | Implication |
|
|
169
|
+
| ------- | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
|
|
170
|
+
| `-103` | Invalid user ID or password | The database was reached far enough to reject authentication. Do not treat this as a missing database name. |
|
|
171
|
+
| `-83` | Specified database not found | The database name/path could not be resolved. Check the database name, DBN/DBF settings, server name, and TDS/driver routing. |
|
|
172
|
+
|
|
173
|
+
For other ODBC-backed databases, look up the database/driver-specific error code before concluding what failed.
|
|
144
174
|
|
|
145
175
|
## Common Pitfalls
|
|
146
176
|
|
|
@@ -154,7 +184,7 @@ odbc://user:pass@host:5000/mydb?DRIVER=FreeTDS&TDS_Version=5.0
|
|
|
154
184
|
|
|
155
185
|
When an ODBC step fails and the cause is not obvious:
|
|
156
186
|
|
|
157
|
-
1. **Read the error message** — superglue includes
|
|
187
|
+
1. **Read the error message** — superglue includes a truncated query preview in the error. Check for syntax errors, missing columns, or type mismatches.
|
|
158
188
|
2. **Verify connection credentials** — use `sg system find` to confirm `storedCredentials` keys match the placeholders in your URL. Test connectivity with a simple `SELECT 1` via `sg system call`.
|
|
159
189
|
3. **Check database-side access** — connection refused or permission denied errors typically mean the database user lacks access. Verify with the user that the credentials have the required grants.
|
|
160
190
|
4. **Check driver availability** — if the error mentions "driver not found", the `DRIVER` query parameter does not match any registered driver in `/etc/odbcinst.ini`. Verify the driver name is correct and the driver is installed in the Docker image.
|
|
@@ -18,9 +18,11 @@ If the user is asking general questions (not building):
|
|
|
18
18
|
|
|
19
19
|
## Authentication
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
API, SDK, CLI, and webhook usage require an **API key**. MCP clients can use OAuth when supported, or API keys for non-interactive setup. Self-hosted deployments also need the API/MCP endpoint URL. There are no workspace IDs, project IDs, or other identifiers.
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
MCP authentication is separate from API/SDK/CLI setup. For MCP OAuth, dynamic client registration, Langdock setup, and named server permissions, use the MCP documentation.
|
|
24
|
+
|
|
25
|
+
Users can generate and manage API keys in **My Credentials -> superglue API keys**. The API endpoint is displayed on the same page.
|
|
24
26
|
|
|
25
27
|
## Interfaces
|
|
26
28
|
|
|
@@ -34,30 +36,35 @@ Users can generate and manage API keys in **Control Panel → API Keys**. The AP
|
|
|
34
36
|
|
|
35
37
|
Tools can be triggered via webhook: `POST {apiEndpoint}/v1/hooks/{toolId}?token={apiKey}`
|
|
36
38
|
|
|
37
|
-
On superglue Cloud, the API endpoint is `https://api.superglue.cloud`. Self-hosted and enterprise deployments use their own API endpoint — users can find theirs under
|
|
39
|
+
On superglue Cloud, the API endpoint is `https://api.superglue.cloud`. Self-hosted and enterprise deployments use their own API endpoint — users can find theirs under My Credentials -> superglue API keys.
|
|
38
40
|
|
|
39
41
|
### OAuth Callback URL
|
|
40
42
|
|
|
41
43
|
OAuth flows require a callback URL: `{appEndpoint}/api/auth/callback`
|
|
42
44
|
|
|
43
|
-
On superglue Cloud, the app endpoint is `https://app.superglue.cloud`. Self-hosted and enterprise deployments use their own app URL. If a user doesn't know their endpoints, they can check the browser URL bar for the app endpoint, and
|
|
45
|
+
On superglue Cloud, the app endpoint is `https://app.superglue.cloud`. Self-hosted and enterprise deployments use their own app URL. If a user doesn't know their endpoints, they can check the browser URL bar for the app endpoint, and My Credentials -> superglue API keys for the API endpoint.
|
|
44
46
|
|
|
45
47
|
## Web App UI Layout
|
|
46
48
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
- **
|
|
52
|
-
- **
|
|
53
|
-
- **
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
-
|
|
59
|
-
-
|
|
60
|
-
- **
|
|
49
|
+
Use this section as the source of truth for high-level web app navigation. Do not invent UI locations that are not listed here.
|
|
50
|
+
|
|
51
|
+
The persistent left sidebar contains these top-level items:
|
|
52
|
+
|
|
53
|
+
- **Agent** (`/`) — primary AI chat assistant for building and debugging tools and systems.
|
|
54
|
+
- **Landscape** (`/landscape`) — graph overview of tools, systems, and their connections.
|
|
55
|
+
- **Tools** (`/tools`, detail at `/tools/{toolId}`) — saved tools; opens the tool playground for editing, testing, and running.
|
|
56
|
+
- **Systems** (`/systems`, detail at `/systems/{systemId}`) — connected external systems with credentials and documentation.
|
|
57
|
+
- **My Credentials** (`/credentials`) — credential management. The **My Credentials** section is for personal user-owned system credentials; the **superglue API keys** section is for API keys. Admins and members open it inside the normal app shell from the sidebar.
|
|
58
|
+
- **Runs** (`/runs`, detail at `/runs/{runId}`) — execution history for full, draft, and single-step tool runs. Runs is a top-level sidebar item, not a Control Panel sub-item.
|
|
59
|
+
- **Control Panel** (`/admin`) — expandable group for organization and account administration:
|
|
60
|
+
- **Overview** (`/admin`) — dashboard summary, including failed-run and schedule summaries.
|
|
61
|
+
- **Schedules** (`/admin?view=schedules`) — scheduled and recurring tool runs.
|
|
62
|
+
- **Access Rules** (`/admin/access`) — role and access-rule configuration; visible to admins on paid tiers. Use the access-rules reference for RBAC behavior, base roles, and personal roles.
|
|
63
|
+
- **Organization** (`/admin?view=organization`) — organization members, invites, and org-level settings; visible on paid tiers. Member management actions are admin-gated.
|
|
64
|
+
- **MCP Servers** (`/admin?view=mcp-servers`) — manage and export named MCP server endpoints. Use the MCP documentation for behavior, permissions, and client setup.
|
|
65
|
+
- **Notifications** (`/admin?view=notifications`) — user notification preferences and failure-alert channels.
|
|
66
|
+
|
|
67
|
+
Below the navigation, the sidebar shows the organization switcher and Sign Out. Depending on the plan, it also shows **Upgrade Plan** or **Subscription**; Subscription opens the external Stripe billing portal. There is no standalone Settings, Profile, or in-app Billing page.
|
|
61
68
|
|
|
62
69
|
## Internals
|
|
63
70
|
|
|
@@ -74,7 +81,6 @@ Left sidebar navigation:
|
|
|
74
81
|
e. Wrap result: `{ currentItem, data, success }`
|
|
75
82
|
f. On failure: abort if `failureBehavior !== "continue"`
|
|
76
83
|
3. **Output transform** (if present): run JS function, validate against outputSchema
|
|
77
|
-
4. **Response filters** (if present): remove/mask/fail on pattern matches
|
|
78
84
|
|
|
79
85
|
### Strategy Routing
|
|
80
86
|
|