#
tokens: 49571/50000 113/180 files (page 1/5)
lines: on (toggle) GitHub
raw markdown copy reset
This is page 1 of 5. Use http://codebase.md/feed-mob/fm-mcp-servers?lines=true&page={x} to view the full context.

# Directory Structure

```
├── .claude
│   └── settings.local.json
├── .cursor
│   └── rules
│       └── typescript-indentation.mdc
├── .github
│   └── workflows
│       ├── publish-civitai-records.yml
│       ├── publish-github-issues.yml
│       ├── publish-imagekit.yml
│       ├── publish-n8n-nodes-feedmob-direct-spend-visualizer.yml
│       ├── publish-reporting-packages.yml
│       └── publish-work-journals.yml
├── .gitignore
├── AGENTS.md
├── package-lock.json
├── README.md
├── src
│   ├── applovin-reporting
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   └── index.ts
│   │   └── tsconfig.json
│   ├── appsamurai-reporting
│   │   ├── .env.example
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   └── index.ts
│   │   └── tsconfig.json
│   ├── civitai-records
│   │   ├── .gitignore
│   │   ├── build.sh
│   │   ├── docker-compose.yml
│   │   ├── docs
│   │   │   └── civitai-owner-createrole.md
│   │   ├── env.sample
│   │   ├── infra
│   │   │   └── db-init
│   │   │       ├── 01-roles.sql
│   │   │       ├── 02_functions.sql
│   │   │       ├── 03_init.sql
│   │   │       ├── 04_create_prompts.sql
│   │   │       ├── 05_create_assets.sql
│   │   │       ├── 06_create_civitai_posts.sql
│   │   │       ├── 07_add_constraints_and_input_assets.sql
│   │   │       ├── 08_migration_add_on_behalf_of.sql
│   │   │       ├── 09_migration_update_functions_for_on_behalf_of.sql
│   │   │       ├── 10_update_on_behalf_of_for_existing_records.sql
│   │   │       ├── 11_create_asset_stats.sql
│   │   │       ├── 12_fix_trigger_for_tables_without_on_behalf_of.sql
│   │   │       └── 13_add_columns_to_asset_stats.sql
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── prisma
│   │   │   └── schema.prisma
│   │   ├── README.md
│   │   ├── src
│   │   │   ├── lib
│   │   │   │   ├── __tests__
│   │   │   │   │   ├── detectRemoteAssetType.test.ts
│   │   │   │   │   └── sha256.test.ts
│   │   │   │   ├── civitaiApi.ts
│   │   │   │   ├── detectRemoteAssetType.ts
│   │   │   │   ├── handleDatabaseError.ts
│   │   │   │   ├── prisma.ts
│   │   │   │   └── sha256.ts
│   │   │   ├── prompts
│   │   │   │   ├── civitai-media-engagement.md
│   │   │   │   ├── civitaiMediaEngagement.ts
│   │   │   │   ├── record-civitai-workflow.md
│   │   │   │   └── recordCivitaiWorkflow.ts
│   │   │   ├── server.ts
│   │   │   └── tools
│   │   │       ├── calculateSha256.ts
│   │   │       ├── createAsset.ts
│   │   │       ├── createCivitaiPost.ts
│   │   │       ├── createPrompt.ts
│   │   │       ├── fetchCivitaiPostAssets.ts
│   │   │       ├── findAsset.ts
│   │   │       ├── getMediaEngagementGuide.ts
│   │   │       ├── getWorkflowGuide.ts
│   │   │       ├── listCivitaiPosts.ts
│   │   │       ├── syncPostAssetStats.ts
│   │   │       └── updateAsset.ts
│   │   └── tsconfig.json
│   ├── feedmob-reporting
│   │   ├── .env.example
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   ├── api.ts
│   │   │   └── index.ts
│   │   └── tsconfig.json
│   ├── femini-reporting
│   │   ├── Dockerfile
│   │   ├── femini_mcp_guide.md
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   └── index.ts
│   │   └── tsconfig.json
│   ├── github-issues
│   │   ├── common
│   │   │   ├── errors.ts
│   │   │   ├── types.ts
│   │   │   ├── utils.ts
│   │   │   └── version.ts
│   │   ├── index.ts
│   │   ├── operations
│   │   │   ├── issues.ts
│   │   │   └── search.ts
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── README.md
│   │   └── tsconfig.json
│   ├── imagekit
│   │   ├── env.sample
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   ├── server.ts
│   │   │   ├── services
│   │   │   │   ├── imageKitUpload.ts
│   │   │   │   └── imageUploader.ts
│   │   │   └── tools
│   │   │       ├── cropAndWatermark.ts
│   │   │       └── uploadFile.ts
│   │   └── tsconfig.json
│   ├── impact-radius-reporting
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   ├── fm_impact_radius_mapping.ts
│   │   │   └── index.ts
│   │   ├── tsconfig.json
│   │   └── yarn.lock
│   ├── inmobi-reporting
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   └── index.ts
│   │   └── tsconfig.json
│   ├── ironsource-aura-reporting
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   └── index.ts
│   │   └── tsconfig.json
│   ├── ironsource-reporting
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   └── index.ts
│   │   └── tsconfig.json
│   ├── jampp-reporting
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   └── index.ts
│   │   └── tsconfig.json
│   ├── kayzen-reporting
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   ├── index.ts
│   │   │   └── kayzen-client.ts
│   │   └── tsconfig.json
│   ├── liftoff-reporting
│   │   ├── .env.example
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   └── index.ts
│   │   └── tsconfig.json
│   ├── mintegral-reporting
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   └── index.ts
│   │   └── tsconfig.json
│   ├── n8n-nodes-feedmob-direct-spend-visualizer
│   │   ├── AGENTS.md
│   │   ├── credentials
│   │   │   └── FeedmobDirectSpendVisualizerApi.credentials.ts
│   │   ├── index.ts
│   │   ├── nodes
│   │   │   └── FeedmobDirectSpendVisualizer
│   │   │       ├── FeedmobDirectSpendVisualizer.node.ts
│   │   │       └── logo.svg
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── scripts
│   │   │   ├── build-assets.js
│   │   │   └── setup-plugin.js
│   │   ├── tsconfig.json
│   │   └── types.d.ts
│   ├── n8n-nodes-sensor-tower
│   │   ├── credentials
│   │   │   └── SensorTowerApi.credentials.ts
│   │   ├── index.ts
│   │   ├── MCP_to_n8n_Guide_zh.md
│   │   ├── nodes
│   │   │   └── SensorTower
│   │   │       ├── logo.svg
│   │   │       └── SensorTower.node.ts
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── tsconfig.json
│   │   └── types.d.ts
│   ├── rtb-house-reporting
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   └── index.ts
│   │   └── tsconfig.json
│   ├── samsung-reporting
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   └── index.ts
│   │   └── tsconfig.json
│   ├── sensor-tower-reporting
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   └── index.ts
│   │   └── tsconfig.json
│   ├── singular-reporting
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   └── index.ts
│   │   └── tsconfig.json
│   ├── smadex-reporting
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   └── index.ts
│   │   └── tsconfig.json
│   ├── tapjoy-reporting
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   └── index.ts
│   │   └── tsconfig.json
│   ├── user-activity-reporting
│   │   ├── .env.example
│   │   ├── package-lock.json
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── src
│   │   │   ├── api.ts
│   │   │   └── index.ts
│   │   └── tsconfig.json
│   └── work-journals
│       ├── package-lock.json
│       ├── package.json
│       ├── README.md
│       ├── src
│       │   └── index.ts
│       └── tsconfig.json
└── tsconfig.json
```

# Files

--------------------------------------------------------------------------------
/src/appsamurai-reporting/.env.example:
--------------------------------------------------------------------------------

```
1 | APPSAMURAI_API_KEY="YOUR_API_KEY_HERE"
2 | 
```

--------------------------------------------------------------------------------
/src/liftoff-reporting/.env.example:
--------------------------------------------------------------------------------

```
1 | APPSAMURAI_API_KEY="YOUR_API_KEY_HERE"
2 | 
```

--------------------------------------------------------------------------------
/src/civitai-records/.gitignore:
--------------------------------------------------------------------------------

```
1 | node_modules
2 | .npm-cache
3 | # Keep environment variables out of version control
4 | .env
5 | 
```

--------------------------------------------------------------------------------
/src/feedmob-reporting/.env.example:
--------------------------------------------------------------------------------

```
1 | FEEDMOB_KEY=your_feedmob_key_here
2 | FEEDMOB_SECRET=your_feedmob_secret_here
3 | FEEDMOB_API_BASE=your_feedmob_api_url
4 | 
```

--------------------------------------------------------------------------------
/src/user-activity-reporting/.env.example:
--------------------------------------------------------------------------------

```
 1 | # Feedmob Admin API
 2 | FEEDMOB_API_BASE=https://admin.feedmob.com
 3 | FEEDMOB_KEY=your_feedmob_key
 4 | FEEDMOB_SECRET=your_feedmob_secret
 5 | 
 6 | # Slack API (for future use)
 7 | SLACK_BOT_TOKEN=xoxb-your-slack-bot-token
 8 | 
 9 | # HubSpot API (for future use)
10 | HUBSPOT_ACCESS_TOKEN=your_hubspot_access_token
11 | 
```

--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------

```
  1 | # Logs
  2 | logs
  3 | *.log
  4 | npm-debug.log*
  5 | yarn-debug.log*
  6 | yarn-error.log*
  7 | lerna-debug.log*
  8 | .pnpm-debug.log*
  9 | 
 10 | # Diagnostic reports (https://nodejs.org/api/report.html)
 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
 12 | 
 13 | # Runtime data
 14 | pids
 15 | *.pid
 16 | *.seed
 17 | *.pid.lock
 18 | 
 19 | # Directory for instrumented libs generated by jscoverage/JSCover
 20 | lib-cov
 21 | 
 22 | # Coverage directory used by tools like istanbul
 23 | coverage
 24 | *.lcov
 25 | 
 26 | # nyc test coverage
 27 | .nyc_output
 28 | 
 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
 30 | .grunt
 31 | 
 32 | # Bower dependency directory (https://bower.io/)
 33 | bower_components
 34 | 
 35 | # node-waf configuration
 36 | .lock-wscript
 37 | 
 38 | # Compiled binary addons (https://nodejs.org/api/addons.html)
 39 | build/Release
 40 | 
 41 | # Dependency directories
 42 | node_modules/
 43 | jspm_packages/
 44 | 
 45 | # Snowpack dependency directory (https://snowpack.dev/)
 46 | web_modules/
 47 | 
 48 | # TypeScript cache
 49 | *.tsbuildinfo
 50 | 
 51 | # Optional npm cache directory
 52 | .npm
 53 | 
 54 | # Optional eslint cache
 55 | .eslintcache
 56 | 
 57 | # Optional stylelint cache
 58 | .stylelintcache
 59 | 
 60 | # Microbundle cache
 61 | .rpt2_cache/
 62 | .rts2_cache_cjs/
 63 | .rts2_cache_es/
 64 | .rts2_cache_umd/
 65 | 
 66 | # Optional REPL history
 67 | .node_repl_history
 68 | 
 69 | # Output of 'npm pack'
 70 | *.tgz
 71 | 
 72 | # Yarn Integrity file
 73 | .yarn-integrity
 74 | 
 75 | # dotenv environment variable files
 76 | .env
 77 | .env.development.local
 78 | .env.test.local
 79 | .env.production.local
 80 | .env.local
 81 | 
 82 | # parcel-bundler cache (https://parceljs.org/)
 83 | .cache
 84 | .parcel-cache
 85 | 
 86 | # Next.js build output
 87 | .next
 88 | out
 89 | 
 90 | # Nuxt.js build / generate output
 91 | .nuxt
 92 | dist
 93 | 
 94 | # Gatsby files
 95 | .cache/
 96 | # Comment in the public line in if your project uses Gatsby and not Next.js
 97 | # https://nextjs.org/blog/next-9-1#public-directory-support
 98 | # public
 99 | 
100 | # vuepress build output
101 | .vuepress/dist
102 | 
103 | # vuepress v2.x temp and cache directory
104 | .temp
105 | .cache
106 | 
107 | # Docusaurus cache and generated files
108 | .docusaurus
109 | 
110 | # Serverless directories
111 | .serverless/
112 | 
113 | # FuseBox cache
114 | .fusebox/
115 | 
116 | # DynamoDB Local files
117 | .dynamodb/
118 | 
119 | # TernJS port file
120 | .tern-port
121 | 
122 | # Stores VSCode versions used for testing VSCode extensions
123 | .vscode-test
124 | 
125 | # yarn v2
126 | .yarn/cache
127 | .yarn/unplugged
128 | .yarn/build-state.yml
129 | .yarn/install-state.gz
130 | .pnp.*
131 | 
132 | build/
133 | 
134 | gcp-oauth.keys.json
135 | .*-server-credentials.json
136 | 
137 | # Byte-compiled / optimized / DLL files
138 | __pycache__/
139 | *.py[cod]
140 | *$py.class
141 | 
142 | # C extensions
143 | *.so
144 | 
145 | # Distribution / packaging
146 | .Python
147 | build/
148 | develop-eggs/
149 | dist/
150 | downloads/
151 | eggs/
152 | .eggs/
153 | lib/
154 | lib64/
155 | parts/
156 | sdist/
157 | var/
158 | wheels/
159 | share/python-wheels/
160 | *.egg-info/
161 | .installed.cfg
162 | *.egg
163 | MANIFEST
164 | 
165 | # PyInstaller
166 | #  Usually these files are written by a python script from a template
167 | #  before PyInstaller builds the exe, so as to inject date/other infos into it.
168 | *.manifest
169 | *.spec
170 | 
171 | # Installer logs
172 | pip-log.txt
173 | pip-delete-this-directory.txt
174 | 
175 | # Unit test / coverage reports
176 | htmlcov/
177 | .tox/
178 | .nox/
179 | .coverage
180 | .coverage.*
181 | .cache
182 | nosetests.xml
183 | coverage.xml
184 | *.cover
185 | *.py,cover
186 | .hypothesis/
187 | .pytest_cache/
188 | cover/
189 | 
190 | # Translations
191 | *.mo
192 | *.pot
193 | 
194 | # Django stuff:
195 | *.log
196 | local_settings.py
197 | db.sqlite3
198 | db.sqlite3-journal
199 | 
200 | # Flask stuff:
201 | instance/
202 | .webassets-cache
203 | 
204 | # Scrapy stuff:
205 | .scrapy
206 | 
207 | # Sphinx documentation
208 | docs/_build/
209 | 
210 | # PyBuilder
211 | .pybuilder/
212 | target/
213 | 
214 | # Jupyter Notebook
215 | .ipynb_checkpoints
216 | 
217 | # IPython
218 | profile_default/
219 | ipython_config.py
220 | 
221 | # pyenv
222 | #   For a library or package, you might want to ignore these files since the code is
223 | #   intended to run in multiple environments; otherwise, check them in:
224 | # .python-version
225 | 
226 | # pipenv
227 | #   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
228 | #   However, in case of collaboration, if having platform-specific dependencies or dependencies
229 | #   having no cross-platform support, pipenv may install dependencies that don't work, or not
230 | #   install all needed dependencies.
231 | #Pipfile.lock
232 | 
233 | # poetry
234 | #   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
235 | #   This is especially recommended for binary packages to ensure reproducibility, and is more
236 | #   commonly ignored for libraries.
237 | #   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
238 | #poetry.lock
239 | 
240 | # pdm
241 | #   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
242 | #pdm.lock
243 | #   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
244 | #   in version control.
245 | #   https://pdm.fming.dev/latest/usage/project/#working-with-version-control
246 | .pdm.toml
247 | .pdm-python
248 | .pdm-build/
249 | 
250 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
251 | __pypackages__/
252 | 
253 | # Celery stuff
254 | celerybeat-schedule
255 | celerybeat.pid
256 | 
257 | # SageMath parsed files
258 | *.sage.py
259 | 
260 | # Environments
261 | .env
262 | .venv
263 | env/
264 | venv/
265 | ENV/
266 | env.bak/
267 | venv.bak/
268 | 
269 | # Spyder project settings
270 | .spyderproject
271 | .spyproject
272 | 
273 | # Rope project settings
274 | .ropeproject
275 | 
276 | # mkdocs documentation
277 | /site
278 | 
279 | # mypy
280 | .mypy_cache/
281 | .dmypy.json
282 | dmypy.json
283 | 
284 | # Pyre type checker
285 | .pyre/
286 | 
287 | # pytype static type analyzer
288 | .pytype/
289 | 
290 | # Cython debug symbols
291 | cython_debug/
292 | 
293 | .DS_Store
294 | 
295 | # PyCharm
296 | #  JetBrains specific template is maintained in a separate JetBrains.gitignore that can
297 | #  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
298 | #  and can be added to the global gitignore or merged into this file.  For a more nuclear
299 | #  option (not recommended) you can uncomment the following to ignore the entire idea folder.
300 | #.idea/
301 | 
302 | .claude/settings.local.json
303 | 
```

--------------------------------------------------------------------------------
/src/feedmob-reporting/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Feedmob Spend MCP Server
 2 | 
 3 | 
 4 | ## Usage with Claude Desktop
 5 | 
 6 | 1. Make sure you have installed and updated to the latest version of Claude for Desktop.
 7 | 2. Open the Claude for Desktop configuration file:
 8 | - macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
 9 | - Windows: %APPDATA%\Claude\claude_desktop_config.json
10 | 3. Add the Feedmob Spend MCP server to the configuration:
11 | 
12 | ### NPX
13 | 
14 | ```json
15 | {
16 |   "mcpServers": {
17 |     "feedmob": {
18 |       "command": "npx",
19 |       "args": [ "-y", "@feedmob/feedmob-reporting" ],
20 |       "env": {
21 |         "FEEDMOB_KEY": "FEEDMOB_KEY",
22 |         "FEEDMOB_SECRET": "FEEDMOB_SECRET",
23 |         "FEEDMOB_API_BASE": "FEEDMOB_API_BASE"
24 |       }
25 |     }
26 |   }
27 | }
28 | ```
29 | 
30 | ## License
31 | 
32 | MIT
33 | 
```

--------------------------------------------------------------------------------
/src/jampp-reporting/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Jampp Reporting MCP Server
 2 | 
 3 | Node.js server implementing Model Context Protocol (MCP) for [Jampp Reporting API](https://developers.jampp.com/docs/reporting-api).
 4 | 
 5 | 
 6 | ## Usage with Claude Desktop
 7 | 
 8 | 1. Make sure you have installed and updated to the latest version of Claude for Desktop.
 9 | 2. Open the Claude for Desktop configuration file:
10 | - macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
11 | - Windows: %APPDATA%\Claude\claude_desktop_config.json
12 | 3. Add the Jampp MCP server to the configuration:
13 | 
14 | ### NPX
15 | 
16 | ```json
17 | {
18 |   "mcpServers": {
19 |     "jampp": {
20 |       "command": "npx",
21 |       "args": [ "-y", "@feedmob/jampp-reporting" ],
22 |       "env": {
23 |         "JAMPP_CLIENT_ID": "your_client_id",
24 |         "JAMPP_CLIENT_SECRET": "your_client_secret"
25 |       }
26 |     }
27 |   }
28 | }
29 | ```
30 | 
31 | ## License
32 | 
33 | MIT
34 | 
```

--------------------------------------------------------------------------------
/src/singular-reporting/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Singular Reporting MCP Server
 2 | 
 3 | Node.js server implementing Model Context Protocol (MCP) for [Singular Reporting](https://support.singular.net/hc/en-us/articles/360045245692-Reporting-API-Reference).
 4 | 
 5 | 
 6 | ## Usage with Claude Desktop
 7 | 
 8 | 1. Make sure you have installed and updated to the latest version of Claude for Desktop.
 9 | 2. Open the Claude for Desktop configuration file:
10 | - macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
11 | - Windows: %APPDATA%\Claude\claude_desktop_config.json
12 | 3. Add the Jampp MCP server to the configuration:
13 | 
14 | ### NPX
15 | 
16 | ```json
17 | {
18 |   "mcpServers": {
19 |     "singular": {
20 |       "command": "npx",
21 |       "args": [ "-y", "@feedmob/singular-reporting" ],
22 |       "env": {
23 |         "SINGULAR_API_KEY": "api_key",
24 |         "SINGULAR_API_BASE_URL": "api_base_url"
25 |       }
26 |     }
27 |   }
28 | }
29 | ```
30 | 
31 | ## License
32 | 
33 | MIT
34 | 
```

--------------------------------------------------------------------------------
/src/kayzen-reporting/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Kayzen Reporting MCP Server
 2 | 
 3 | Node.js server implementing Model Context Protocol (MCP) for [Kayzen Reporting API](https://developers.kayzen.io/reference/list-reports).
 4 | 
 5 | 
 6 | ## Usage with Claude Desktop
 7 | 
 8 | 1. Make sure you have installed and updated to the latest version of Claude for Desktop.
 9 | 2. Open the Claude for Desktop configuration file:
10 | - macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
11 | - Windows: %APPDATA%\Claude\claude_desktop_config.json
12 | 3. Add the Jampp MCP server to the configuration:
13 | 
14 | ### NPX
15 | 
16 | ```json
17 | {
18 |   "mcpServers": {
19 |     "kayzen": {
20 |       "command": "npx",
21 |       "args": [ "-y", "@feedmob/kayzen-reporting" ],
22 |       "env": {
23 |         "KAYZEN_USERNAME": "user_email",
24 |         "KAYZEN_PASSWORD": "user_password",
25 |         "KAYZEN_BASIC_AUTH": "baisc_auth_token"
26 |       }
27 |     }
28 |   }
29 | }
30 | ```
31 | 
32 | ## License
33 | 
34 | MIT
35 | 
```

--------------------------------------------------------------------------------
/src/femini-reporting/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Feedmob Femini MCP Server
 2 | 
 3 | ## Features
 4 | 
 5 | - 🔍 **Flexible Data Querying**: Supports various grouping methods and filtering conditions
 6 | - 📊 **Rich Metrics**: Includes key metrics such as spend, revenue, conversion rate, etc.
 7 | - 📚 **Detailed Documentation**: Built-in user manual and query templates
 8 | - 🚀 **Easy Integration**: Based on the FastMCP framework, supports multiple transport methods
 9 | 
10 | ## Installation and Setup
11 | 
12 | Visit femini dash specified page to get mcp server json configuration
13 | 
14 | ## Tools
15 | 
16 | ### 1. query_campaign_spends
17 | The primary tool for querying ad campaign data.
18 | 
19 | **Parameters:**
20 | - `guide`: Required, user manual URI (`campaign-spends-api-guide://usage`)
21 | - `date_gteq`: Start date (YYYY-MM-DD)
22 | - `date_lteq`: End date (YYYY-MM-DD)
23 | - `groups`: Array of grouping methods (day/week/month/client/partner/campaign/click_url/country)
24 | - `metrics`: Array of metrics (gross/net/revenue/impressions/clicks/installs/cvr/margin)
25 | - `legacy_client_id_in`: Client ID filter
26 | - `legacy_partner_id_in`: Partner ID filter
27 | - `legacy_campaign_id_in`: Campaign ID filter
28 | - `legacy_click_url_id_in`: Click URL ID filter
29 | 
30 | ### 2. search_ids
31 | Retrieves client, partner, and campaign ID information based on keywords.
32 | 
33 | **Parameters:**
34 | - `keys`: List of keywords (array of strings)
35 | 
36 | ## Resources
37 | 
38 | ### 1. CampaignSpendsApiQuery User Manual
39 | URI: `campaign-spends-api-guide://usage`
40 | 
41 | Detailed API parameter descriptions and usage guide.
42 | 
43 | ## Development and Debugging
44 | 
45 | ### Local Development
46 | ```bash
47 | # Start development server
48 | npm run dev
49 | 
50 | # Test with MCP CLI
51 | npx fastmcp dev src/index.ts
52 | 
53 | # Debug with MCP Inspector
54 | npx fastmcp inspect src/index.ts
55 | ```
56 | 
57 | ### Type Checking
58 | ```bash
59 | npx tsc --noEmit
60 | ```
61 | ## License
62 | 
63 | MIT License
64 | 
65 | ## Contributions
66 | 
67 | Welcome to submit Issues and Pull Requests to improve this project.
68 | # feedmob_femini_mcp_server
69 | 
```

--------------------------------------------------------------------------------
/src/work-journals/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Feedmob Work Journals MCP Server
 2 | 
 3 | ## Features
 4 | 
 5 | *   📝 **Work Journal Management**: Supports querying, creating, and updating work journals.
 6 | *   🔍 **Flexible Querying**: Supports filtering logs by date range, user ID, and team ID.
 7 | *   🔗 **API Integration**: Interacts with backend APIs by configuring `API_URL` and `API_TOKEN`.
 8 | *   📚 **Built-in Resources**: Provides Schema information for the Time Off API.
 9 | 
10 | ## Installation and Setup
11 | 
12 | Visit feedmob time off dash specified page to get mcp server json configuration
13 | 
14 | ## Tools
15 | 
16 | ### 1. `query_journals`
17 | 
18 | Queries work journals, supporting filtering by date range, user ID, and team ID.
19 | 
20 | **Parameters:**
21 | 
22 | *   `scheam`: Required, get from system resources `time-off-api-scheam://usage`.
23 | *   `start_date`: Start date (YYYY-MM-DD format), defaults to 7 days before today.
24 | *   `end_date`: End date (YYYY-MM-DD format), defaults to today.
25 | *   `current_user_only`: Optional, whether to query only the current user's work journals (true/false).
26 | *   `user_ids`: Optional, list of user IDs (array).
27 | *   `team_ids`: Optional, list of team IDs (array).
28 | 
29 | ### 2. `create_or_update_journal`
30 | 
31 | Creates or updates a work journal.
32 | 
33 | **Parameters:**
34 | 
35 | *   `date`: Required, journal date (YYYY-MM-DD format).
36 | *   `content`: Required, journal content.
37 | 
38 | ## Resources
39 | 
40 | ### 1. Time Off API Schema, including Teams, Users Information
41 | 
42 | URI: `time-off-api-scheam://usage`
43 | 
44 | Provides Schema information for the Time Off API, including team and user information.
45 | 
46 | ## Development and Debugging
47 | 
48 | ### Local Development
49 | 
50 | ```bash
51 | # Start development server
52 | npm run dev
53 | 
54 | # Test with MCP CLI
55 | npx fastmcp dev src/index.ts
56 | 
57 | # Debug with MCP Inspector
58 | npx fastmcp inspect src/index.ts
59 | ```
60 | 
61 | ### Type Checking
62 | 
63 | ```bash
64 | npx tsc --noEmit
65 | ```
66 | 
67 | ## License
68 | 
69 | MIT License
70 | 
71 | ## Contributions
72 | 
73 | Welcome to submit Issues and and Pull Requests to improve this project.
74 | 
```

--------------------------------------------------------------------------------
/src/appsamurai-reporting/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # AppSamurai Reporting MCP Server
 2 | 
 3 | This MCP server provides tools and prompts to interact with the [AppSamurai Campaign Spend API](https://help.appsamurai.com/en/articles/11105087-appsamurai-campaign-spend-api).
 4 | 
 5 | ## Features
 6 | 
 7 | - **Tools**:
 8 |   - `get_appsamurai_campaign_spend`: Fetches campaign spending data for a specified date range with optional filtering.
 9 | - **Prompts**:
10 |   - `check_appsamurai_campaign_spend`: Guides users on how to check campaign spend.
11 | 
12 | ## Parameters
13 | 
14 | The following parameters are supported:
15 | 
16 | - **Required**:
17 |   - `startDate`: Start date in YYYY-MM-DD format
18 |   - `endDate`: End date in YYYY-MM-DD format
19 | - **Optional Filters**:
20 |   - `campaignId`: Filter by specific campaign ID
21 |   - `bundleId`: Filter by specific application bundle ID
22 |   - `platform`: Filter by platform (e.g., ios, play)
23 |   - `campaignName`: Filter by campaign name
24 |   - `country`: Filter by country in ISO 3166-1 alpha-2 format (e.g., US, GB)
25 | 
26 | ## Setup
27 | 
28 | 1.  **Install dependencies**:
29 |     ```bash
30 |     npm install
31 |     ```
32 | 2.  **Configure environment variables**:
33 |     - Copy `.env.example` to `.env`.
34 |     - Fill in your `APPSAMURAI_API_KEY` in the `.env` file.
35 | 3.  **Build the server**:
36 |     ```bash
37 |     npm run build
38 |     ```
39 | 
40 | ## Running the Server
41 | 
42 | To run the server directly for testing:
43 | 
44 | ```bash
45 | npm start
46 | ```
47 | 
48 | ## Connecting to a Client (e.g., Claude Desktop)
49 | 
50 | Add the following configuration to your client's MCP server settings (e.g., `claude_desktop_config.json`), replacing `/path/to/appsamurai-reporting` with the actual absolute path:
51 | 
52 | ```json
53 | {
54 |   "mcpServers": {
55 |     "appsamurai-reporting": {
56 |       "command": "npx",
57 |       "args": [ "-y", "@feedmob/appsamurai-reporting"],
58 |       "env": {
59 |         "APPSAMURAI_API_KEY": "api_key"
60 |       }
61 |     }
62 |   }
63 | }
64 | ```
65 | 
66 | Remember to set the `APPSAMURAI_API_KEY` in the environment where the client (like Claude Desktop) runs or add it to the `env` block in the client configuration if supported.
67 | 
```

--------------------------------------------------------------------------------
/src/liftoff-reporting/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Liftoff Reporting MCP Server
 2 | 
 3 | This MCP server provides tools to interact with the [Liftoff Reporting API](https://docs.liftoff.io/advertiser/reporting_api).
 4 | 
 5 | ## Features
 6 | 
 7 | - **Tools**:
 8 |   - `create_liftoff_report`: Generates a new report based on specified parameters.
 9 |   - `check_liftoff_report_status`: Checks the status of a previously generated report.
10 |   - `download_liftoff_report_data`: Downloads the data for a completed report (CSV or JSON).
11 |   - `list_liftoff_apps`: Fetches details of available Liftoff applications.
12 |   - `list_liftoff_campaigns`: Fetches details of available Liftoff campaigns.
13 |   - `download_liftoff_report_with_names`: Downloads report data and enriches it with campaign names.
14 | - **Prompts**: (Currently no specific prompts defined)
15 | 
16 | ## Setup
17 | 
18 | 1.  **Install dependencies**:
19 |     ```bash
20 |     npm install
21 |     ```
22 | 2.  **Configure environment variables**:
23 |     - Copy `.env.example` to `.env` (if it exists, otherwise create `.env`).
24 |     - Fill in your `LIFTOFF_API_KEY` and `LIFTOFF_API_SECRET` in the `.env` file.
25 | 3.  **Build the server**:
26 |     ```bash
27 |     npm run build
28 |     ```
29 | 
30 | ## Running the Server
31 | 
32 | To run the server directly for testing:
33 | 
34 | ```bash
35 | npm start
36 | ```
37 | 
38 | ## Connecting to a Client (e.g., Cursor)
39 | 
40 | Add the following configuration to your client's MCP server settings (e.g., in Cursor settings), replacing `/path/to/liftoff-reporting` with the actual absolute path if running locally, or using the package name if installed globally:
41 | 
42 | ```json
43 | {
44 |   "mcpServers": {
45 |     "liftoff-reporting": {
46 |       "command": "npx",
47 |       "args": ["-y", "@feedmob/liftoff-reporting"], // Replace with correct package name if needed
48 |       "env": {
49 |         "LIFTOFF_API_KEY": "your_liftoff_api_key",
50 |         "LIFTOFF_API_SECRET": "your_liftoff_api_secret"
51 |       }
52 |     }
53 |   }
54 | }
55 | ```
56 | 
57 | Remember to set the `LIFTOFF_API_KEY` and `LIFTOFF_API_SECRET` in the environment where the client runs or add them to the `env` block in the client configuration.
58 | 
```

--------------------------------------------------------------------------------
/src/user-activity-reporting/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # User Activity Reporting MCP
 2 | 
 3 | MCP server for querying client contacts, Slack messages, and HubSpot tickets.
 4 | 
 5 | ## Features
 6 | 
 7 | | Tool | Description |
 8 | |------|-------------|
 9 | | `get_all_client_contacts` | List all clients with team members |
10 | | `get_client_team_members` | Get team (AA, AM, AE, PM, PA, AO) for a client |
11 | | `get_clients_by_pod` | List clients in a POD team |
12 | | `get_clients_by_name` | Find clients by person name |
13 | | `get_user_slack_history` | Search Slack messages from a user |
14 | | `get_hubspot_tickets` | Query HubSpot tickets |
15 | | `get_hubspot_ticket_detail` | Get ticket details |
16 | | `get_hubspot_tickets_by_user` | Find tickets by owner |
17 | 
18 | ## Environment Variables
19 | 
20 | | Variable | Required | Description |
21 | |----------|----------|-------------|
22 | | `FEEDMOB_API_BASE` | Yes | Feedmob Admin API URL (e.g., `https://admin.feedmob.com`) |
23 | | `FEEDMOB_KEY` | Yes | Feedmob API key |
24 | | `FEEDMOB_SECRET` | Yes | Feedmob API secret |
25 | | `SLACK_BOT_TOKEN` | No | Slack Bot token for message search |
26 | | `HUBSPOT_ACCESS_TOKEN` | No | HubSpot private app token |
27 | 
28 | ## Setup
29 | 
30 | ```bash
31 | cd src/user-activity-reporting
32 | npm install
33 | npm run build
34 | ```
35 | 
36 | ## Development
37 | 
38 | ```bash
39 | npm run dev      # Run with hot reload
40 | npm run inspect  # Test tools interactively
41 | npm run build    # Compile to dist/
42 | ```
43 | 
44 | ## MCP Configuration
45 | 
46 | ```json
47 | {
48 |   "mcpServers": {
49 |     "user-activity-reporting": {
50 |       "command": "npx",
51 |       "args": ["-y", "@feedmob/user-activity-reporting"],
52 |       "env": {
53 |         "FEEDMOB_API_BASE": "https://admin.feedmob.com",
54 |         "FEEDMOB_KEY": "your_key",
55 |         "FEEDMOB_SECRET": "your_secret",
56 |         "SLACK_BOT_TOKEN": "xoxb-xxx",
57 |         "HUBSPOT_ACCESS_TOKEN": "pat-xxx"
58 |       }
59 |     }
60 |   }
61 | }
62 | ```
63 | 
64 | ## Usage Examples
65 | 
66 | ```
67 | # Get team for a client
68 | Tool: get_client_team_members
69 | Args: { "client_name": "Uber" }
70 | 
71 | # Find clients by person
72 | Tool: get_clients_by_name
73 | Args: { "name": "John", "role": "am" }
74 | 
75 | # Search Slack messages
76 | Tool: get_user_slack_history
77 | Args: { "user_name": "John", "query": "budget" }
78 | ```
79 | 
```

--------------------------------------------------------------------------------
/src/tapjoy-reporting/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # TapJoy Reporting MCP Server
 2 | 
 3 | Node.js server implementing Model Context Protocol (MCP) for [TapJoy Reporting API](https://api.tapjoy.com/graphql/docs/guide-getting_started).
 4 | 
 5 | ## Features
 6 | 
 7 | This server provides the following tool:
 8 | 
 9 | *   **`get_advertiser_adset_spend`**: Retrieves spend data for active advertiser ad sets within a specified date range.
10 |     *   **Input Parameters**:
11 |         *   `start_date` (string): The start date for the report in `YYYY-MM-DD` format.
12 |         *   `end_date` (string): The end date for the report in `YYYY-MM-DD` format.
13 |     *   **Output**: Returns a JSON array of objects, each containing the campaign name (`campaign.name`) and the spend in USD (`insights.reports[0].spendUSD`).
14 | 
15 | ## Setup
16 | 
17 | 1.  **Environment Variables**: Before running the server, you need to set the `TAPJOY_API_KEY` environment variable. This key is used for authenticating with the Tapjoy API. You can obtain this key from your Tapjoy account.
18 | 
19 |     ```bash
20 |     export TAPJOY_API_KEY='your_tapjoy_api_key'
21 |     ```
22 | 
23 | ## Usage with Claude Desktop
24 | 
25 | 1.  Make sure you have installed and updated to the latest version of Claude for Desktop.
26 | 2.  Open the Claude for Desktop configuration file:
27 |     *   macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
28 |     *   Windows: `%APPDATA%\Claude\claude_desktop_config.json`
29 | 3.  Add the Tapjoy MCP server to the `mcpServers` configuration section:
30 | 
31 |     ```json
32 |     {
33 |       "mcpServers": {
34 |         "tapjoy": {
35 |           "command": "npx",
36 |           "args": [ "-y", "@feedmob/tapjoy-reporting" ]
37 |           "env": {
38 |             "TAPJOY_API_KEY": "your_tapjoy_api_key_base64_encoded"
39 |           }
40 |         }        // ... other servers
41 |       }
42 |     }
43 |     ```
44 |     *Replace `/path/to/fm-mcp-servers/src/tapjoy-reporting/dist/index.js` with the actual path to the compiled JavaScript file after building the project.*
45 |     *Alternatively, if published to npm, you could use `npx` similar to the previous Jampp example.*
46 | 
47 | ## Development
48 | 
49 | 1.  Clone the repository.
50 | 2.  Navigate to the `src/tapjoy-reporting` directory.
51 | 3.  Install dependencies: `npm install`
52 | 4.  Set the required environment variable (`TAPJOY_API_KEY`).
53 | 5.  Build the project: `npm run build`
54 | 6.  Run the server directly: `node dist/index.js`
55 | 
56 | ## License
57 | 
58 | MIT
59 | 
```

--------------------------------------------------------------------------------
/src/smadex-reporting/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Smadex Reporting MCP Server
 2 | 
 3 | Node.js server implementing Model Context Protocol (MCP) for Smadex Reporting API.
 4 | 
 5 | ## Features
 6 | 
 7 | This server provides the following tools:
 8 | 
 9 | *   **`get_smadex_report_id`**: Creates a Smadex report request and returns the report ID.
10 |     *   **Input Parameters**:
11 |         *   `startDate` (string, required): Start date for the report in `YYYY-MM-DD` format.
12 |         *   `endDate` (string, required): End date for the report in `YYYY-MM-DD` format.
13 |     *   **Output**: Returns the report ID as text.
14 | 
15 | *   **`get_smadex_report_download_url`**: Gets the download URL for a Smadex report by its ID.
16 |     *   **Input Parameters**:
17 |         *   `reportId` (string, required): The report ID returned from get_smadex_report_id.
18 |     *   **Output**: Returns the download URL as text.
19 | 
20 | *   **`get_smadex_report`**: Downloads and returns report data from a Smadex report download URL.
21 |     *   **Input Parameters**:
22 |         *   `downloadUrl` (string, required): The download URL for the report.
23 |     *   **Output**: Returns the report data as text.
24 | 
25 | ## Setup
26 | 
27 | 1.  **Environment Variables**: Before running the server, you need to set the following environment variables:
28 | 
29 |     ```bash
30 |     export SMADEX_API_BASE_URL='your_smadex_api_base_url'
31 |     export SMADEX_EMAIL='your_smadex_email'
32 |     export SMADEX_PASSWORD='your_smadex_password'
33 |     ```
34 | 
35 | ## Usage with Claude Desktop
36 | 
37 | 1.  Make sure you have installed and updated to the latest version of Claude for Desktop.
38 | 2.  Open the Claude for Desktop configuration file:
39 |     *   macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
40 |     *   Windows: `%APPDATA%\Claude\claude_desktop_config.json`
41 | 3.  Add the Smadex MCP server to the `mcpServers` configuration section:
42 | 
43 |     ```json
44 |     {
45 |       "mcpServers": {
46 |         "smadex": {
47 |           "command": "npx",
48 |           "args": [ "-y", "@feedmob/smadex-reporting" ]
49 |           "env": {
50 |             "SMADEX_API_BASE_URL": "your_smadex_api_base_url",
51 |             "SMADEX_EMAIL": "your_smadex_email",
52 |             "SMADEX_PASSWORD": "your_smadex_password"
53 |           }
54 |         }
55 |       }
56 |     }
57 |     ```
58 | 
59 | ## Development
60 | 
61 | 1.  Clone the repository.
62 | 2.  Navigate to the `src/smadex-reporting` directory.
63 | 3.  Install dependencies: `npm install`
64 | 4.  Set the required environment variables (`SMADEX_API_BASE_URL`, `SMADEX_EMAIL`, and `SMADEX_PASSWORD`).
65 | 5.  Build the project: `npm run build`
66 | 6.  Run the server directly: `node dist/index.js`
67 | 
68 | ## License
69 | 
70 | MIT
71 | 
```

--------------------------------------------------------------------------------
/src/impact-radius-reporting/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Impact Radius Reporting MCP Server
 2 | 
 3 | Node.js server implementing Model Context Protocol (MCP) for [Impact Radius](https://impact.com/) affiliate marketing reporting with FeedMob campaign mapping integration.
 4 | 
 5 | ## Features
 6 | 
 7 | - **Campaign Mapping Integration**: Automatically fetches campaign mappings from FeedMob API to enrich Impact Radius data
 8 | - **Action List Reporting**: Retrieves action lists from Impact Radius API for specified date ranges
 9 | - **Data Enrichment**: Combines Impact Radius action data with campaign context including client names and campaign information
10 | - **Flexible Filtering**: Supports filtering by campaign, ad, and event type through mapping configurations
11 | 
12 | ## Available Tools
13 | 
14 | ### fetch_action_list_from_impact_radius
15 | 
16 | Fetches action list from Impact Radius API with campaign mapping integration for a date range.
17 | 
18 | **Parameters:**
19 | - `start_date` (string, required): Start date in YYYY-MM-DD format
20 | - `end_date` (string, required): End date in YYYY-MM-DD format
21 | 
22 | **Returns:**
23 | - JSON object with `allrecords` array containing enriched action data
24 | - Each record includes original Impact Radius data plus mapping fields:
25 |   - `mapping_impact_brand`: Impact brand from mapping
26 |   - `mapping_impact_ad`: Impact ad from mapping
27 |   - `mapping_impact_event_type`: Impact event type from mapping
28 |   - `campaign`: Campaign name from FeedMob
29 |   - `client_name`: Client name from FeedMob
30 | - `total_count`: Total number of records returned
31 | 
32 | ## Usage with Claude Desktop
33 | 
34 | 1. Make sure you have installed and updated to the latest version of Claude for Desktop.
35 | 2. Open the Claude for Desktop configuration file:
36 | - macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
37 | - Windows: %APPDATA%\Claude\claude_desktop_config.json
38 | 3. Add the Impact Radius MCP server to the configuration:
39 | 
40 | ### NPX
41 | 
42 | ```json
43 | {
44 |   "mcpServers": {
45 |     "impact-radius": {
46 |       "command": "npx",
47 |       "args": [ "-y", "@feedmob/impact-radius-reporting" ],
48 |       "env": {
49 |         "IMPACT_RADIUS_SID": "your_impact_radius_sid",
50 |         "IMPACT_RADIUS_TOKEN": "your_impact_radius_token",
51 |         "FEEDMOB_KEY": "your_feedmob_key",
52 |         "FEEDMOB_SECRET": "your_feedmob_secret",
53 |         "FEEDMOB_API_BASE": "your_api_base_url"
54 |       }
55 |     }
56 |   }
57 | }
58 | ```
59 | 
60 | ## Authentication Requirements
61 | 
62 | This server requires authentication for both Impact Radius and FeedMob APIs:
63 | 
64 | - **Impact Radius**: Requires `IMPACT_RADIUS_SID` and `IMPACT_RADIUS_TOKEN` for HTTP Basic Authentication
65 | - **FeedMob**: Requires `FEEDMOB_KEY` and `FEEDMOB_SECRET` for JWT authentication to access campaign mappings
66 | 
67 | ## License
68 | 
69 | MIT
70 | 
```

--------------------------------------------------------------------------------
/src/applovin-reporting/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # AppLovin Reporting MCP Server
 2 | 
 3 | Node.js server implementing Model Context Protocol (MCP) for [AppLovin Reporting API](https://dash.applovin.com/documentation/mediation/reporting-api).
 4 | 
 5 | ## Features
 6 | 
 7 | This server provides the following tool:
 8 | 
 9 | *   **`get_advertiser_report`**: Retrieves campaign spending data from AppLovin Reporting API for advertisers.
10 |     *   **Input Parameters**:
11 |         *   `start_date` (string, required): The start date for the report in `YYYY-MM-DD` format.
12 |         *   `end_date` (string, required): The end date for the report in `YYYY-MM-DD` format.
13 |         *   `columns` (string, optional): Comma-separated list of columns to include (e.g., 'day,campaign,impressions,clicks,conversions,cost').
14 |         *   `format` (string, optional): Format of the report data ('json' or 'csv'). Default is 'json'.
15 |         *   `filter_campaign` (string, optional): Filter results by campaign name.
16 |         *   `filter_country` (string, optional): Filter results by country (e.g., 'US,JP').
17 |         *   `filter_platform` (string, optional): Filter results by platform (e.g., 'android,ios').
18 |         *   `sort_column` (string, optional): Column to sort by (e.g., 'cost').
19 |         *   `sort_order` (string, optional): Sort order ('ASC' or 'DESC').
20 |     *   **Output**: Returns the report data in the specified format (JSON or CSV).
21 | 
22 | ## Setup
23 | 
24 | 1.  **Environment Variables**: Before running the server, you need to set the `APPLOVIN_API_KEY` environment variable. This key is used for authenticating with the AppLovin API. You can obtain this key from your AppLovin account.
25 | 
26 |     ```bash
27 |     export APPLOVIN_API_KEY='your_applovin_api_key'
28 |     ```
29 | 
30 | ## Usage with Claude Desktop
31 | 
32 | 1.  Make sure you have installed and updated to the latest version of Claude for Desktop.
33 | 2.  Open the Claude for Desktop configuration file:
34 |     *   macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
35 |     *   Windows: `%APPDATA%\Claude\claude_desktop_config.json`
36 | 3.  Add the AppLovin MCP server to the `mcpServers` configuration section:
37 | 
38 |     ```json
39 |     {
40 |       "mcpServers": {
41 |         "applovin": {
42 |           "command": "npx",
43 |           "args": [ "-y", "@feedmob/applovin-reporting" ]
44 |           "env": {
45 |             "APPLOVIN_API_KEY": "your_applovin_api_key"
46 |           }
47 |         }
48 |       }
49 |     }
50 |     ```
51 | 
52 | ## Development
53 | 
54 | 1.  Clone the repository.
55 | 2.  Navigate to the `src/applovin-reporting` directory.
56 | 3.  Install dependencies: `npm install`
57 | 4.  Set the required environment variable (`APPLOVIN_API_KEY`).
58 | 5.  Build the project: `npm run build`
59 | 6.  Run the server directly: `node dist/index.js`
60 | 
61 | ## License
62 | 
63 | MIT
64 | 
```

--------------------------------------------------------------------------------
/src/rtb-house-reporting/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # RTB House Reporting MCP Server
 2 | 
 3 | Node.js server implementing Model Context Protocol (MCP) for RTB House API.
 4 | 
 5 | ## Features
 6 | 
 7 | This server provides the following tools:
 8 | 
 9 | *   **`get_rtb_house_data`**: Fetch reporting data from RTB House API for a specific date range.
10 |     *   **Input Parameters**:
11 |         *   `dateFrom` (string, required): Start date for the report in `YYYY-MM-DD` format.
12 |         *   `dateTo` (string, required): End date for the report in `YYYY-MM-DD` format.
13 |         *   `app` (string, optional): Optional app/advertiser name to filter results. If not provided, returns data for all advertisers.
14 |         *   `maxRetries` (integer, optional): Maximum number of retry attempts (default: 3).
15 |     *   **Output**: Returns a mapping of app/advertiser name to data array as JSON. Each data item includes fields such as `day`, `subcampaign`, `impsCount`, `clicksCount`, `campaignCost`, etc.
16 | 
17 | ## Setup
18 | 
19 | 1.  **Environment Variables**: Before running the server, you need to set the following environment variables:
20 | 
21 |     ```bash
22 |     export RTB_HOUSE_USER='your_rtbhouse_username'
23 |     export RTB_HOUSE_PASSWORD='your_rtbhouse_password'
24 |     ```
25 | 
26 |     **Required Environment Variables:**
27 |     *   `RTB_HOUSE_USER`: RTB House API username
28 |     *   `RTB_HOUSE_PASSWORD`: RTB House API password
29 | 
30 | ## Usage
31 | 
32 | 1.  Start the server after setting the required environment variables:
33 | 
34 |     ```bash
35 |     node dist/index.js
36 |     ```
37 | 
38 | 2.  The server exposes the following tool:
39 | 
40 |     *   **get_rtb_house_data**
41 |         *   `dateFrom` (string, required): Start date in `YYYY-MM-DD` format
42 |         *   `dateTo` (string, required): End date in `YYYY-MM-DD` format
43 |         *   `app` (string, optional): App/advertiser name (case-insensitive)
44 |         *   `maxRetries` (integer, optional): Maximum retry attempts (default: 3)
45 |         *   **Returns**: `{ [appName]: [ { day, subcampaign, impsCount, clicksCount, campaignCost, ... } ] }`
46 | 
47 |     Example request:
48 |     ```json
49 |     {
50 |       "dateFrom": "2025-06-10",
51 |       "dateTo": "2025-06-15"
52 |     }
53 |     ```
54 | 
55 |     Example response:
56 |     ```json
57 |     {
58 |       "US_ZipRecruiter_App": [
59 |         {
60 |           "subcampaign": "campaign_name",
61 |           "day": "2025-06-14",
62 |           "impsCount": 138733,
63 |           "clicksCount": 4946,
64 |           "campaignCost": 378.49
65 |         },
66 |         ...
67 |       ]
68 |     }
69 |     ```
70 | 
71 | ## Development
72 | 
73 | 1.  Clone the repository.
74 | 2.  Navigate to the `src/rtb-house-reporting` directory.
75 | 3.  Install dependencies: `npm install`
76 | 4.  Set the required environment variables (`RTB_HOUSE_USER`, `RTB_HOUSE_PASSWORD`).
77 | 5.  Build the project: `npm run build`
78 | 6.  Run the server directly: `node dist/index.js`
79 | 
80 | ## License
81 | 
82 | MIT
83 | 
```

--------------------------------------------------------------------------------
/src/mintegral-reporting/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Mintegral Reporting MCP Server
 2 | 
 3 | Node.js server implementing Model Context Protocol (MCP) for Mintegral Reporting API.
 4 | 
 5 | ## Features
 6 | 
 7 | This server provides the following tool:
 8 | 
 9 | *   **`get_mintegral_performance_report`**: Retrieves performance data from Mintegral Reporting API.
10 |     *   **Input Parameters**:
11 |         *   `start_date` (string, required): Start date for the report in `YYYY-MM-DD` format.
12 |         *   `end_date` (string, required): End date for the report in `YYYY-MM-DD` format.
13 |         *   `utc` (string, optional): Timezone (default: '+8').
14 |         *   `per_page` (number, optional): Number of results per page (max: 5000). Default is 50.
15 |         *   `page` (number, optional): Page number. Default is 1.
16 |         *   `dimension` (string, optional): Data dimension (e.g., 'location', 'sub_id', 'creative').
17 |         *   `uuid` (string, optional): Filter by uuid.
18 |         *   `campaign_id` (number, optional): Filter by campaign_id.
19 |         *   `package_name` (string, optional): Filter by android bundle id or ios app store id.
20 |         *   `not_empty_field` (string, optional): Fields that can't be empty (comma-separated: 'click', 'install', 'impression', 'spend').
21 |     *   **Output**: Returns the report data in JSON format.
22 | 
23 | ## API Limitations
24 | 
25 | * Date range cannot exceed 8 days for a single request
26 | * The per_page parameter cannot exceed 5000
27 | 
28 | ## Setup
29 | 
30 | 1.  **Environment Variables**: Before running the server, you need to set the following environment variables:
31 | 
32 |     ```bash
33 |     export MINTEGRAL_ACCESS_KEY='your_mintegral_access_key'
34 |     export MINTEGRAL_API_KEY='your_mintegral_api_key'
35 |     ```
36 | 
37 | ## Usage with Claude Desktop
38 | 
39 | 1.  Make sure you have installed and updated to the latest version of Claude for Desktop.
40 | 2.  Open the Claude for Desktop configuration file:
41 |     *   macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
42 |     *   Windows: `%APPDATA%\Claude\claude_desktop_config.json`
43 | 3.  Add the Mintegral MCP server to the `mcpServers` configuration section:
44 | 
45 |     ```json
46 |     {
47 |       "mcpServers": {
48 |         "mintegral": {
49 |           "command": "npx",
50 |           "args": [ "-y", "@feedmob/mintegral-reporting" ]
51 |           "env": {
52 |             "MINTEGRAL_ACCESS_KEY": "your_mintegral_access_key",
53 |             "MINTEGRAL_API_KEY": "your_mintegral_api_key"
54 |           }
55 |         }
56 |       }
57 |     }
58 |     ```
59 | 
60 | ## Development
61 | 
62 | 1.  Clone the repository.
63 | 2.  Navigate to the `src/mintegral-reporting` directory.
64 | 3.  Install dependencies: `npm install`
65 | 4.  Set the required environment variables (`MINTEGRAL_ACCESS_KEY` and `MINTEGRAL_API_KEY`).
66 | 5.  Build the project: `npm run build`
67 | 6.  Run the server directly: `node dist/index.js`
68 | 
69 | ## License
70 | 
71 | MIT
72 | 
```

--------------------------------------------------------------------------------
/src/inmobi-reporting/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Inmobi Reporting MCP Server
 2 | 
 3 | Node.js server implementing Model Context Protocol (MCP) for Inmobi Reporting API.
 4 | 
 5 | ## Features
 6 | 
 7 | This server provides the following tools:
 8 | 
 9 | *   **`generate_inmobi_report_ids`**: Generates Inmobi report IDs for SKAN (iOS) and non-SKAN (Android) reports.
10 |     *   **Input Parameters**:
11 |         *   `startDate` (string, required): Start date for the report in `YYYY-MM-DD` format.
12 |         *   `endDate` (string, required): End date for the report in `YYYY-MM-DD` format.
13 |     *   **Output**: Returns JSON with `skanReportId` and `nonSkanReportId`.
14 | 
15 | *   **`fetch_inmobi_report_data`**: Fetches data from Inmobi reports using report IDs.
16 |     *   **Input Parameters**:
17 |         *   `skanReportId` (string, required): SKAN report ID obtained from generate_inmobi_report_ids.
18 |         *   `nonSkanReportId` (string, required): Non-SKAN report ID obtained from generate_inmobi_report_ids.
19 |     *   **Output**: Returns the combined data from both reports.
20 | 
21 | ## Setup
22 | 
23 | 1.  **Environment Variables**: Before running the server, you need to set the following environment variables:
24 | 
25 |     ```bash
26 |     export INMOBI_AUTH_URL='your_inmobi_auth_url'
27 |     export INMOBI_SKAN_REPORT_URL='your_inmobi_skan_report_url'
28 |     export INMOBI_NON_SKAN_REPORT_URL='your_inmobi_non_skan_report_url'
29 |     export INMOBI_REPORT_BASE_URL='your_inmobi_report_base_url'
30 |     export INMOBI_CLIENT_ID='your_inmobi_client_id'
31 |     export INMOBI_CLIENT_SECRET='your_inmobi_client_secret'
32 |     ```
33 | 
34 | ## Usage with Claude Desktop
35 | 
36 | 1.  Make sure you have installed and updated to the latest version of Claude for Desktop.
37 | 2.  Open the Claude for Desktop configuration file:
38 |     *   macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
39 |     *   Windows: `%APPDATA%\Claude\claude_desktop_config.json`
40 | 3.  Add the Inmobi MCP server to the `mcpServers` configuration section:
41 | 
42 |     ```json
43 |     {
44 |       "mcpServers": {
45 |         "inmobi": {
46 |           "command": "npx",
47 |           "args": [ "-y", "@feedmob/inmobi-reporting" ],
48 |           "env": {
49 |             "INMOBI_AUTH_URL": "your_inmobi_auth_url",
50 |             "INMOBI_SKAN_REPORT_URL": "your_inmobi_skan_report_url",
51 |             "INMOBI_NON_SKAN_REPORT_URL": "your_inmobi_non_skan_report_url",
52 |             "INMOBI_REPORT_BASE_URL": "your_inmobi_report_base_url",
53 |             "INMOBI_CLIENT_ID": "your_inmobi_client_id",
54 |             "INMOBI_CLIENT_SECRET": "your_inmobi_client_secret"
55 |           }
56 |         }
57 |       }
58 |     }
59 |     ```
60 | 
61 | ## Development
62 | 
63 | 1.  Clone the repository.
64 | 2.  Navigate to the `src/inmobi-reporting` directory.
65 | 3.  Install dependencies: `npm install`
66 | 4.  Set the required environment variables.
67 | 5.  Build the project: `npm run build`
68 | 6.  Run the server directly: `node dist/index.js`
69 | 
70 | ## License
71 | 
72 | MIT
73 | 
```

--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Model Context Protocol (MCP) Servers
 2 | 
 3 | This repository contains a collection of [MCP](https://modelcontextprotocol.io) servers developed and maintained by the FeedMob Development Team.
 4 | 
 5 | ## 📚 Overview
 6 | 
 7 | MCP (Model Context Protocol) servers provide structured data and context to AI models, enabling them to better understand and interact with specific domains and data sources.
 8 | 
 9 | ## 🚀 Available Servers
10 | 
11 | ### Advertising & Marketing
12 | 
13 | - **[Jampp Reporting](src/jampp-reporting)** - Integration with Jampp's reporting API for advertising campaign data
14 |   - Campaign spend tracking
15 |   - Performance metrics
16 |   - Daily statistics
17 | 
18 | - **[Kayzen Reporting](src/kayzen-reporting)** - Integration with Kayzen's reporting API for advertising campaign data
19 |   - List all reports
20 |   - Get report's data
21 | 
22 | - **[Singular Reporting](src/singular-reporting)** - Integration with Singular's reporting API for advertising campaign data
23 |   - Getting reporting data from Singular API
24 | 
25 | - **[Appsamurai Reporting](src/appsamurai-reporting)** - Integration with AppSamurai Campaign Spend API for advertising campaign data
26 |   - Getting reporting data AppSamurai Campaign Spend API
27 | 
28 | - **[TapJoy Reporting](src/tapjoy-reporting/)** -  Integration with TapJoy's reporting API for advertising campaign data
29 |   - Retrieves spend data for active advertiser ad sets within a specified date range
30 | 
31 | - **[Applovin Reporting](src/applovin-reporting/)** -  Integration with Applovin's reporting API for advertising campaign data
32 |   - Retrieves spend data for active advertiser ad sets within a specified date range
33 | 
34 | - **[IronSource Reporting](src/ironsource-reporting/)** -  Integration with IronSource's reporting API for advertising campaign data
35 |   - Retrieves spend data for active advertiser ad sets within a specified date range
36 | 
37 | - **[Mintegral Reporting](src/mintegral-reporting/)** -  Integration with Mintegral's reporting API for advertising campaign data
38 |   - Retrieves spend data for active advertiser ad sets within a specified date range
39 | 
40 | - **[Inmobi Reporting](src/inmobi-reporting/)** -  Integration with Inmobi's reporting API for advertising campaign data
41 |   - Retrieves spend data for active advertiser ad sets within a specified date range
42 | 
43 | - **[Liftoff Reporting](src/liftoff-reporting)** - Integration with Liftoff's reporting API for advertising campaign data
44 |   - Create reports
45 |   - Check report status
46 |   - Download report data (CSV or JSON)
47 |   - List apps
48 |   - List campaigns
49 |   - Download report data enriched with campaign names
50 | 
51 | ## 📖 Documentation
52 | Each server implementation includes its own detailed documentation in its respective directory.
53 | 
54 | 
55 | ## 🤝 Contributing
56 | 
57 | We welcome contributions! Please feel free to submit a Pull Request.
58 | 
59 | ## 📄 License
60 | 
61 | This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
62 | 
63 | ---
64 | 
65 | Developed and maintained with ❤️ by FeedMob Development Team
66 | 
```

--------------------------------------------------------------------------------
/src/github-issues/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # FeedMob GitHub Issues MCP Server
 2 | 
 3 | A GitHub Issues MCP server customized for the FeedMob team
 4 | 
 5 | ## Tools
 6 | 
 7 | ### `search_issues`
 8 | - Search GitHub Issues through FeedMob API
 9 | - Input parameters:
10 |   - `scheam` (string, required): Get from system resource `issues/search_schema`
11 |   - `start_date` (string): Issue creation start date, defaults to 6 days ago
12 |   - `end_date` (string): Issue creation end date, defaults to today
13 |   - `status` (optional string): Issue status, e.g., 'open', 'closed'
14 |   - `repo` (optional string)
15 |   - `users` (optional string[]): List of users
16 |   - `team` (optional string): Team name, e.g., 'Star', 'Mighty'
17 | - Returns: Search results
18 | 
19 | ### `create_issue`
20 | - Create a new Issue in a GitHub repository
21 | - Input parameters:
22 |   - `owner` (optional string): Repository owner, can use environment variable default
23 |   - `repo` (string, required): Repository name
24 |   - `title` (string, required): Issue title
25 |   - `body` (optional string): Issue description
26 |   - `assignees` (optional string[]): Usernames to assign to
27 |   - `labels` (optional string[]): Labels to add
28 |   - `milestone` (optional number): Milestone number
29 | - Returns: Created Issue details
30 | 
31 | ### `update_issue`
32 | - Update an existing Issue
33 | - Input parameters:
34 |   - `owner` (string, required): Repository owner
35 |   - `repo` (string, required): Repository name
36 |   - `issue_number` (number, required): Issue number to update
37 |   - `title` (optional string): New title
38 |   - `body` (optional string): New description
39 |   - `state` (optional string): New state ('open' or 'closed')
40 |   - `labels` (optional string[]): New labels
41 |   - `assignees` (optional string[]): New assignees
42 |   - `milestone` (optional number): New milestone number
43 | - Returns: Updated Issue details
44 | 
45 | ### `get_issue`
46 | - Get details of a specific Issue in a repository
47 | - Input parameters:
48 |   - `owner` (string, required): Repository owner
49 |   - `repo` (string, required):
50 |   - `issue_number` (number, required): Issue number to retrieve
51 | - Returns: GitHub Issue object and details
52 | 
53 | ### `add_issue_comment`
54 | - Add a comment to an existing Issue
55 | - Input parameters:
56 |   - `owner` (string, required): Repository owner
57 |   - `repo` (string, required):
58 |   - `issue_number` (number, required): Issue number
59 |   - `body` (string, required): Comment content
60 | - Returns: Created comment details
61 | 
62 | ### `sync_latest_issues`
63 | - Sync GitHub Issues Latest Data By FeedMob API
64 | 
65 | ## Resources
66 | 
67 | ### `issues/search_schema`
68 | - Provides schema definition for Issues search
69 | 
70 | ### Local Development
71 | For local development, you can run the server using the following commands:
72 | 
73 | ```bash
74 | # Install dependencies
75 | npm install
76 | 
77 | # Build project
78 | npm run build
79 | 
80 | # Run server
81 | npx tsx src/github-issues/index.ts
82 | ```
83 | 
84 | ## License
85 | 
86 | This MCP server is licensed under the MIT License. This means you can freely use, modify, and distribute this software, but must comply with the terms and conditions of the MIT License. For more details, please refer to the LICENSE file in the project repository.
87 | 
```

--------------------------------------------------------------------------------
/src/samsung-reporting/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Samsung Reporting MCP Server
 2 | 
 3 | Node.js server implementing Model Context Protocol (MCP) for Samsung API.
 4 | 
 5 | ## Features
 6 | 
 7 | This server provides the following tools:
 8 | 
 9 | *   **`get_samsung_content_metrics`**: Fetch content metrics from Samsung API for a specific date range.
10 |     *   **Input Parameters**:
11 |         *   `startDate` (string, required): Start date for the report in `YYYY-MM-DD` format.
12 |         *   `endDate` (string, required): End date for the report in `YYYY-MM-DD` format.
13 |         *   `metricIds` (array of strings, optional): Optional array of metric IDs to fetch. Defaults to standard metrics if not provided:
14 |             *   `total_unique_installs_filter`
15 |             *   `revenue_total`
16 |             *   `revenue_iap_order_count`
17 |             *   `daily_rat_score`
18 |             *   `daily_rat_volumne`
19 |     *   **Output**: Returns the content metrics data as JSON.
20 | 
21 | ## Setup
22 | 
23 | 1.  **Environment Variables**: Before running the server, you need to set the following environment variables:
24 | 
25 |     ```bash
26 |     export SAMSUNG_ISS='your_samsung_issuer'
27 |     export SAMSUNG_PRIVATE_KEY='your_samsung_private_key'
28 |     export SAMSUNG_CONTENT_ID='your_samsung_content_id'
29 |     ```
30 | 
31 |     **Required Environment Variables:**
32 |     *   `SAMSUNG_ISS`: Samsung issuer identifier for JWT authentication
33 |     *   `SAMSUNG_PRIVATE_KEY`: Private key for JWT signing (RS256 algorithm)
34 |     *   `SAMSUNG_CONTENT_ID`: Content ID for which to fetch metrics
35 | 
36 | ## Usage with Claude Desktop
37 | 
38 | 1.  Make sure you have installed and updated to the latest version of Claude for Desktop.
39 | 2.  Open the Claude for Desktop configuration file:
40 |     *   macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
41 |     *   Windows: `%APPDATA%\Claude\claude_desktop_config.json`
42 | 3.  Add the Samsung MCP server to the `mcpServers` configuration section:
43 | 
44 |     ```json
45 |     {
46 |       "mcpServers": {
47 |         "samsung": {
48 |           "command": "npx",
49 |           "args": [ "-y", "@feedmob/samsung-reporting" ],
50 |           "env": {
51 |             "SAMSUNG_ISS": "your_samsung_issuer",
52 |             "SAMSUNG_PRIVATE_KEY": "your_samsung_private_key",
53 |             "SAMSUNG_CONTENT_ID": "your_samsung_content_id"
54 |           }
55 |         }
56 |       }
57 |     }
58 |     ```
59 | 
60 | ## Authentication
61 | 
62 | The server uses JWT (JSON Web Token) authentication with RS256 algorithm to authenticate with Samsung API:
63 | 
64 | 1.  Generates a JWT token using the provided private key and issuer
65 | 2.  Uses the JWT to obtain an access token from Samsung's auth endpoint
66 | 3.  Uses the access token for subsequent API calls to fetch content metrics
67 | 
68 | The JWT token includes:
69 | *   `iss`: Samsung issuer identifier
70 | *   `scopes`: `['publishing', 'gss']`
71 | *   `exp`: Token expiration (20 minutes from issue time)
72 | *   `iat`: Token issue time
73 | 
74 | ## Development
75 | 
76 | 1.  Clone the repository.
77 | 2.  Navigate to the `src/samsung-reporting` directory.
78 | 3.  Install dependencies: `npm install`
79 | 4.  Set the required environment variables (`SAMSUNG_ISS`, `SAMSUNG_PRIVATE_KEY`, and `SAMSUNG_CONTENT_ID`).
80 | 5.  Build the project: `npm run build`
81 | 6.  Run the server directly: `node dist/index.js`
82 | 
83 | ## License
84 | 
85 | MIT
86 | 
```

--------------------------------------------------------------------------------
/src/ironsource-reporting/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # IronSource Reporting MCP Server
 2 | 
 3 | Node.js server implementing Model Context Protocol (MCP) for IronSource Reporting API for advertisers.
 4 | 
 5 | ## Features
 6 | 
 7 | This server provides the following tool:
 8 | 
 9 | *   **`get_advertiser_report_from_ironsource`**: Retrieves campaign spending data from IronSource Reporting API for advertisers.
10 |     *   **Input Parameters**:
11 |         *   `startDate` (string, required): The start date for the report in `YYYY-MM-DD` format.
12 |         *   `endDate` (string, required): The end date for the report in `YYYY-MM-DD` format.
13 |         *   `metrics` (string, optional): Comma-separated list of metrics to include (default: 'impressions,clicks,completions,installs,spend').
14 |         *   `breakdowns` (string, optional): Comma-separated list of breakdowns (default: 'day,campaign').
15 |         *   `format` (string, optional): Format of the report data ('json' or 'csv'). Default is 'json'.
16 |         *   `count` (number, optional): Number of records to return (default: 10000, max: 250000).
17 |         *   `campaignId` (string, optional): Filter by comma-separated list of campaign IDs.
18 |         *   `bundleId` (string, optional): Filter by comma-separated list of bundle IDs.
19 |         *   `creativeId` (string, optional): Filter by comma-separated list of creative IDs.
20 |         *   `country` (string, optional): Filter by comma-separated list of countries (ISO 3166-2).
21 |         *   `os` (string, optional): Filter by operating system (ios or android).
22 |         *   `deviceType` (string, optional): Filter by device type (phone or tablet).
23 |         *   `adUnit` (string, optional): Filter by ad unit type (e.g., 'rewardedVideo,interstitial').
24 |         *   `order` (string, optional): Order results by breakdown/metric.
25 |         *   `direction` (string, optional): Order direction ('asc' or 'desc'). Default is 'asc'.
26 |     *   **Output**: Returns the report data in the specified format (JSON or CSV).
27 | 
28 | ## Setup
29 | 
30 | 1.  **Environment Variables**: Before running the server, you need to set the following environment variables:
31 | 
32 |     ```bash
33 |     export IRONSOURCE_SECRET_KEY='your_ironsource_secret_key'
34 |     export IRONSOURCE_REFRESH_TOKEN='your_ironsource_refresh_token'
35 |     ```
36 | 
37 | ## Usage with Claude Desktop
38 | 
39 | 1.  Make sure you have installed and updated to the latest version of Claude for Desktop.
40 | 2.  Open the Claude for Desktop configuration file:
41 |     *   macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
42 |     *   Windows: `%APPDATA%\Claude\claude_desktop_config.json`
43 | 3.  Add the IronSource MCP server to the `mcpServers` configuration section:
44 | 
45 |     ```json
46 |     {
47 |       "mcpServers": {
48 |         "ironsource": {
49 |           "command": "npx",
50 |           "args": [ "-y", "@feedmob/ironsource-reporting" ]
51 |           "env": {
52 |             "IRONSOURCE_SECRET_KEY": "your_ironsource_secret_key",
53 |             "IRONSOURCE_REFRESH_TOKEN": "your_ironsource_refresh_token"
54 |           }
55 |         }
56 |       }
57 |     }
58 |     ```
59 | 
60 | ## Development
61 | 
62 | 1.  Clone the repository.
63 | 2.  Navigate to the `src/ironsource-reporting` directory.
64 | 3.  Install dependencies: `npm install`
65 | 4.  Set the required environment variables (`IRONSOURCE_SECRET_KEY` and `IRONSOURCE_REFRESH_TOKEN`).
66 | 5.  Build the project: `npm run build`
67 | 6.  Run the server directly: `node dist/index.js`
68 | 
69 | ## License
70 | 
71 | MIT
72 | 
```

--------------------------------------------------------------------------------
/src/ironsource-aura-reporting/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # IronSource Aura Reporting MCP Server
 2 | 
 3 | Node.js server implementing Model Context Protocol (MCP) for IronSource Aura Reporting API for advertisers.
 4 | 
 5 | ## Features
 6 | 
 7 | This server provides the following tool:
 8 | 
 9 | *   **`get_advertiser_report_from_aura`**: Retrieves campaign spending data from Aura(IronSource) Reporting API for advertisers.
10 |     *   **Input Parameters**:
11 |         *   `startDate` (string, required): The start date for the report in `YYYY-MM-DD` format.
12 |         *   `endDate` (string, required): The end date for the report in `YYYY-MM-DD` format.
13 |         *   `metrics` (string, optional): Comma-separated list of metrics to include (default: 'impressions,clicks,completions,installs,spend').
14 |         *   `breakdowns` (string, optional): Comma-separated list of breakdowns (default: 'day,campaign_name').
15 |         *   `format` (string, optional): Format of the report data ('json' or 'csv'). Default is 'json'.
16 |         *   `count` (number, optional): Number of records to return (default: 10000, max: 250000).
17 |         *   `campaignId` (string, optional): Filter by comma-separated list of campaign IDs.
18 |         *   `bundleId` (string, optional): Filter by comma-separated list of bundle IDs.
19 |         *   `creativeId` (string, optional): Filter by comma-separated list of creative IDs.
20 |         *   `country` (string, optional): Filter by comma-separated list of countries (ISO 3166-2).
21 |         *   `os` (string, optional): Filter by operating system (ios or android).
22 |         *   `deviceType` (string, optional): Filter by device type (phone or tablet).
23 |         *   `adUnit` (string, optional): Filter by ad unit type (e.g., 'rewardedVideo,interstitial').
24 |         *   `order` (string, optional): Order results by breakdown/metric.
25 |         *   `direction` (string, optional): Order direction ('asc' or 'desc'). Default is 'asc'.
26 |     *   **Output**: Returns the report data in the specified format (JSON or CSV).
27 | 
28 | ## Setup
29 | 
30 | 1.  **Environment Variables**: Before running the server, you need to set the following environment variables:
31 | 
32 |     ```bash
33 |     export IRONSOURCE_AURA_API_KEY='your_ironsource_aura_api_key'
34 |     export IRONSOURCE_AURA_API_BASE_URL='https://api_base_url'
35 |     ```
36 | 
37 | ## Usage with Claude Desktop
38 | 
39 | 1.  Make sure you have installed and updated to the latest version of Claude for Desktop.
40 | 2.  Open the Claude for Desktop configuration file:
41 |     *   macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
42 |     *   Windows: `%APPDATA%\Claude\claude_desktop_config.json`
43 | 3.  Add the IronSource Aura MCP server to the `mcpServers` configuration section:
44 | 
45 |     ```json
46 |     {
47 |       "mcpServers": {
48 |         "ironsource-aura": {
49 |           "command": "npx",
50 |           "args": [ "-y", "@feedmob/ironsource-aura-reporting" ],
51 |           "env": {
52 |             "IRONSOURCE_AURA_API_KEY": "your_ironsource_aura_api_key",
53 |             "IRONSOURCE_AURA_API_BASE_URL": "your_api_base_url"
54 |           }
55 |         }
56 |       }
57 |     }
58 |     ```
59 | 
60 | ## Development
61 | 
62 | 1.  Clone the repository.
63 | 2.  Navigate to the `src/ironsource-aura-reporting` directory.
64 | 3.  Install dependencies: `npm install`
65 | 4.  Set the required environment variables (`IRONSOURCE_AURA_API_KEY` and `IRONSOURCE_AURA_API_BASE_URL`).
66 | 5.  Build the project: `npm run build`
67 | 6.  Run the server directly: `node dist/index.js`
68 | 
69 | ## License
70 | 
71 | MIT
72 | 
```

--------------------------------------------------------------------------------
/src/civitai-records/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # FeedMob Civitai Records MCP Server
 2 | 
 3 | MCP server for managing Civitai content workflows including prompts, assets (images/videos), and publication records. Tracks the full lifecycle from content generation to Civitai publication with support for many-to-many associations between posts, assets, and prompts.
 4 | 
 5 | ## Prerequisites
 6 | - Node.js 18+
 7 | - npm 9+
 8 | 
 9 | ## Installation
10 | ```bash
11 | npm install
12 | ```
13 | Run the command inside `src/civitai-records/`. Dependencies are local to this package.
14 | 
15 | ## Local Database
16 | Launch the Postgres container defined in `docker-compose.yml` to apply the init scripts under `infra/db-init`:
17 | ```bash
18 | docker compose up -d db
19 | ```
20 | Once the container finishes seeding, connect with the seeded sample login (`richard`) to verify access:
21 | ```bash
22 | PGPASSWORD=richard_password psql -h localhost -U richard -d civitai
23 | ```
24 | Inside the session set the schema search path so you only query the `civitai` schema:
25 | ```sql
26 | SET search_path TO civitai;
27 | ```
28 | 
29 | ## Available Scripts
30 | - `npm run dev` — start the server with `tsx` for hot reload during development.
31 | - `npm run dev:cli` — enter the FastMCP interactive development CLI.
32 | - `npm run inspect` — open the FastMCP inspector to exercise the server’s tools.
33 | - `npm run build` — compile TypeScript to `dist/` using the shared compiler defaults.
34 | - `npm run start` — execute the compiled server from `dist/server.js` for smoke testing.
35 | 
36 | ## Tools
37 | 
38 | ### Prompt Management
39 | - `create_prompt` — Create a new prompt record with content, model info, purpose, and metadata.
40 | 
41 | ### Asset Management
42 | - `create_asset` — Create a new asset (image/video) record with URI, source, optional input/output prompt associations, and metadata.
43 | - `update_asset_prompt` — Update the input or output prompt association for an existing asset.
44 | 
45 | ### Civitai Post Management
46 | - `create_civitai_post` — Record a new Civitai publication with status, asset reference, title, description, and metadata.
47 | - `update_civitai_post_asset` — Update the primary asset association for an existing Civitai post.
48 | - `create_post_association` — Create many-to-many associations between Civitai posts and assets or prompts.
49 | - `list_civitai_posts` — Query Civitai posts with filtering by civitai_id, asset_id, asset_type, status, created_by, or time range. Supports pagination and optional detailed asset/prompt inclusion.
50 | - `fetch_civitai_post_assets` — Retrieve the live media assets (images/videos) for a specific post directly from the public Civitai Images API without persisting them. Accepts the Civitai post ID plus pagination controls and returns engagement stats (likes, hearts, comments, etc.). Use this to inspect performance or get the Civitai media assets (Civitai images) for the post.
51 | 
52 | ### Environment Variables
53 | Copy `env.sample` to `.env` if you need local configuration:
54 | ```bash
55 | cp env.sample .env
56 | ```
57 | 
58 | Add any required secrets as you build out the integration. Currently required:
59 | - `DATABASE_URL` — PostgreSQL connection string for the Civitai records database (format: `postgres://user:password@host:5432/database`).
60 | - `CIVITAI_ACCOUNT` — Civitai account username for post attribution (default: `c29`).
61 | 
62 | The server automatically loads `.env` via `dotenv` for all npm scripts.
63 | 
64 | ## Usage with Claude Desktop
65 | Add the server to your Claude configuration to expose the tools to Claude:
66 | ```json
67 | {
68 |   "mcpServers": {
69 |     "feedmob-civitai-records": {
70 |       "command": "npx",
71 |       "args": ["-y", "@feedmob/civitai-records"],
72 |       "transport": "stdio",
73 |       "env": {
74 |         "DATABASE_URL": "postgres://user:password@host:5432/database",
75 |         "CIVITAI_ACCOUNT": "c29"
76 |       }
77 |     }
78 |   }
79 | }
80 | ```
81 | Adjust the `args` if you run from a local path or different entry point.
82 | 
83 | ## Development Notes
84 | - Implement new tooling in `src/tools/` and register each tool via `src/server.ts`.
85 | - Protect external inputs with `zod` schemas and emit helpful error messages.
86 | - Co-locate tests beside the code (for example, `src/tools/__tests__/records.test.ts`) and wire `npm test` once coverage exists.
87 | - Load secrets from environment variables instead of hardcoding them.
88 | 
```

--------------------------------------------------------------------------------
/src/n8n-nodes-feedmob-direct-spend-visualizer/README.md:
--------------------------------------------------------------------------------

```markdown
 1 | # FeedMob Direct Spend Visualizer – n8n Nodes
 2 | 
 3 | These community nodes wrap the FeedMob Claude Agent plugin (“direct spend visualizer”) so that n8n workflows can trigger Claude via AWS Bedrock, run FeedMob’s MCP-aware skill, and emit chart-ready direct spend insights without writing custom code.
 4 | 
 5 | ## Requirements
 6 | 
 7 | 1. `npm install` automatically clones [`feed-mob/claude-code-marketplace`](https://github.com/feed-mob/claude-code-marketplace) into `vendor/claude-code-marketplace`. Ensure `git` is on the host; rerun `npm install` (or `node scripts/setup-plugin.js`) anytime you need the latest plugin changes.
 8 | 2. FeedMob MCP credentials (`FEEDMOB_KEY`, `FEEDMOB_SECRET`, `FEEDMOB_API_BASE`) are required. Generate keys at [FeedMob Admin → API Keys](https://admin.feedmob.com/api_keys).
 9 | 3. Supply AWS Bedrock credentials with access to Anthropic Claude models (`AWS_REGION`, `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`). The node sets `CLAUDE_CODE_USE_BEDROCK=1` and uses your configured model IDs.
10 | 
11 | ## Local development
12 | 
13 | Follow the official n8n guide: https://docs.n8n.io/integrations/creating-nodes/test/run-node-locally/
14 | 
15 | ### Steps
16 | 
17 | 1. **Install n8n globally**
18 |    ```bash
19 |    npm install n8n -g
20 |    ```
21 | 
22 | 2. **Build and link this node**
23 |    ```bash
24 |    cd src/n8n-nodes-feedmob-direct-spend-visualizer
25 |    npm install
26 |    npm run build
27 |    npm link
28 |    ```
29 | 
30 | 3. **Link the node into your local n8n installation**
31 |    ```bash
32 |    # Navigate to your n8n custom nodes directory
33 |    # e.g., ~/.n8n/custom or ~/.n8n/<CUSTOM_NAME> if N8N_CUSTOM_EXTENSIONS is set
34 |    cd ~/.n8n/custom
35 |    npm link @feedmob/n8n-nodes-feedmob-direct-spend-visualizer
36 |    ```
37 | 
38 |    > **Note:** If `~/.n8n/custom` doesn't exist, create it manually and run `npm init -y` before linking.
39 | 
40 | 4. **Start n8n**
41 |    ```bash
42 |    n8n start
43 |    ```
44 | 
45 | 5. **Test the node**
46 |    Open http://localhost:5678 and search for "Direct Spend Visualizer" in the node panel (search by node name, not package name).
47 | 
48 | Ensure AWS and FeedMob credentials are available in the n8n process environment for the Claude Agent SDK to authenticate properly.
49 | 
50 | ## Installing inside n8n
51 | 
52 | * **n8n Cloud / UI** – Settings → Community Nodes → Install → enter `@feedmob/n8n-nodes-feedmob-direct-spend-visualizer`.
53 | * **Self-hosted** – include `N8N_COMMUNITY_PACKAGES="@feedmob/n8n-nodes-feedmob-direct-spend-visualizer"` in your process / container env variables.
54 | 
55 | Make sure community nodes are allowed for your workspace before installing.
56 | 
57 | ## Credentials
58 | 
59 | Create credentials of type **FeedMob Direct Spend Visualizer** and fill the following fields:
60 | 
61 | | Field | Description |
62 | | --- | --- |
63 | | AWS Region | Defaults to `us-east-1`. Region used for Bedrock Claude. |
64 | | AWS Access Key ID | Required. Must have permissions to invoke Anthropic models via Bedrock. |
65 | | AWS Secret Access Key | Required. Secret for the above key. |
66 | | FeedMob Key | Required. Exported to `FEEDMOB_KEY` for the plugin’s MCP server (create via https://admin.feedmob.com/api_keys). |
67 | | FeedMob Secret | Required. Exported to `FEEDMOB_SECRET` (create via https://admin.feedmob.com/api_keys). |
68 | | FeedMob API Base | Required. Exported to `FEEDMOB_API_BASE`. |
69 | | Anthropic Model (primary) | Defaults to `us.anthropic.claude-sonnet-4-20250514-v1:0`. |
70 | | Anthropic Model (fast) | Defaults to `us.anthropic.claude-3-5-haiku-20241022-v1:0`. |
71 | 
72 | ## Supported operations
73 | 
74 | | Operation | Description |
75 | | --- | --- |
76 | | **Visualize Spend** | Provide `start_date`, `end_date`, and `click_url_id`. The node loads `vendor/claude-code-marketplace/plugins/direct-spend-visualizer`, starts the Claude Agent SDK (with `allowedTools: ["Skill","mcp__plugin_direct-spend-visualizer_feedmob__get_direct_spends"]`), and returns the skill’s ASCII chart plus JSON (status, summary, data). |
77 | 
78 | ## Troubleshooting tips
79 | 
80 | * The plugin is bundled under `vendor/claude-code-marketplace/plugins/direct-spend-visualizer`. If it’s missing or out of date, rerun `npm install` or execute `node scripts/setup-plugin.js`.
81 | * The Agent SDK call whitelists the FeedMob MCP tool (`mcp__plugin_direct-spend-visualizer_feedmob__get_direct_spends`) so it can access the API without prompting. Ensure your FeedMob credentials are valid or the tool will fail with a permission error.
82 | * Max turns default to 50 to give Claude enough room to fetch data, render ASCII charts, and format the JSON output. Lower this in the node settings if you need faster runs.
83 | 
84 | ## Scripts
85 | 
86 | * `npm run build` – compile TypeScript and copy the SVG icon into `dist/`.
87 | * `npm run dev` – run TypeScript in watch mode during development.
88 | * `node scripts/setup-plugin.js` – reclone or refresh the FeedMob plugin marketplace (normally run for you during `npm install`).
89 | 
90 | ## License
91 | 
92 | MIT
93 | 
```

--------------------------------------------------------------------------------
/src/sensor-tower-reporting/README.md:
--------------------------------------------------------------------------------

```markdown
  1 | # Sensor Tower Reporting MCP Server
  2 | 
  3 | This MCP server provides tools to interact with the [Sensor Tower API](https://sensortower.com/api) for mobile app intelligence and market data.
  4 | 
  5 | ## Features
  6 | 
  7 | - **Tools**:
  8 |   - [`get_app_metadata`](src/index.ts:929): Fetch app metadata including name, publisher, categories, description, screenshots, and ratings
  9 |   - [`get_top_in_app_purchases`](src/index.ts:981): Fetch top in-app purchases for iOS apps
 10 |   - [`get_compact_sales_report_estimates`](src/index.ts:1030): Get download and revenue estimates in compact format (revenues in cents)
 11 |   - [`get_active_users`](src/index.ts:1119): Fetch active user estimates (DAU/WAU/MAU) by country and date
 12 |   - [`get_category_history`](src/index.ts:1194): Get detailed category ranking history for apps
 13 |   - [`get_category_ranking_summary`](src/index.ts:1274): Fetch today's category ranking summary
 14 |   - [`get_network_analysis`](src/index.ts:1329): Get impressions share of voice (SOV) time series
 15 |   - [`get_network_analysis_rank`](src/index.ts:1405): Fetch network analysis ranking data
 16 |   - [`get_retention`](src/index.ts:1481): Get app retention data (day 1 to day 90)
 17 |   - [`get_downloads_by_sources`](src/index.ts:1551): Fetch app downloads by sources (organic, paid, browser)
 18 | 
 19 | ## Setup
 20 | 
 21 | 1. **Install dependencies**:
 22 |    ```bash
 23 |    npm install
 24 |    ```
 25 | 
 26 | 2. **Configure environment variables**:
 27 |    Create a `.env` file with the following variables:
 28 |    ```env
 29 |    AUTH_TOKEN=your_sensor_tower_auth_token
 30 |    SENSOR_TOWER_BASE_URL=https://api.sensortower.com
 31 |    ```
 32 | 
 33 | 3. **Build the server**:
 34 |    ```bash
 35 |    npm run build
 36 |    ```
 37 | 
 38 | ## Running the Server
 39 | 
 40 | To run the server directly for testing:
 41 | 
 42 | ```bash
 43 | npm start
 44 | ```
 45 | 
 46 | For development with hot reload:
 47 | 
 48 | ```bash
 49 | npm run dev
 50 | ```
 51 | 
 52 | ## Usage with Claude Desktop
 53 | 
 54 | 1. Make sure you have installed and updated to the latest version of Claude for Desktop.
 55 | 2. Open the Claude for Desktop configuration file:
 56 |    - macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
 57 |    - Windows: `%APPDATA%\Claude\claude_desktop_config.json`
 58 | 3. Add the Sensor Tower Reporting MCP server to the configuration:
 59 | 
 60 | ### NPX
 61 | 
 62 | ```json
 63 | {
 64 |   "mcpServers": {
 65 |     "sensor-tower-reporting": {
 66 |       "command": "npx",
 67 |       "args": ["-y", "@feedmob/sensor-tower-reporting"],
 68 |       "env": {
 69 |         "AUTH_TOKEN": "your_sensor_tower_auth_token",
 70 |         "SENSOR_TOWER_BASE_URL": "https://api.sensortower.com"
 71 |       }
 72 |     }
 73 |   }
 74 | }
 75 | ```
 76 | 
 77 | ### Local Development
 78 | 
 79 | ```json
 80 | {
 81 |   "mcpServers": {
 82 |     "sensor-tower-reporting": {
 83 |       "command": "node",
 84 |       "args": ["dist/index.js"],
 85 |       "cwd": "/path/to/sensor-tower-reporting",
 86 |       "env": {
 87 |         "AUTH_TOKEN": "your_sensor_tower_auth_token",
 88 |         "SENSOR_TOWER_BASE_URL": "https://api.sensortower.com"
 89 |       }
 90 |     }
 91 |   }
 92 | }
 93 | ```
 94 | 
 95 | ## API Reference
 96 | 
 97 | ### App Metadata
 98 | - **Platform Support**: iOS, Android
 99 | - **Limits**: Maximum 100 app IDs per request
100 | - **Returns**: App name, publisher, categories, description, screenshots, ratings
101 | 
102 | ### Sales & Revenue Data
103 | - **Compact Sales Report**: Download and revenue estimates with flexible filtering
104 | - **Revenue Format**: All revenues returned in cents
105 | - **Filtering**: By app IDs, publisher IDs, unified IDs, or categories
106 | 
107 | ### User Analytics
108 | - **Active Users**: DAU/WAU/MAU estimates by country and time period
109 | - **Retention**: Day 1 to day 90 retention rates with baseline comparison
110 | - **Limits**: Maximum 500 app IDs for active users and retention
111 | 
112 | ### Ranking & Category Data
113 | - **Category History**: Detailed ranking history by category and chart type
114 | - **Category Summary**: Current ranking summary for specific apps
115 | - **Hourly Rankings**: Available for iOS apps
116 | 
117 | ### Advertising Intelligence
118 | - **Network Analysis**: Share of voice (SOV) for advertising networks
119 | - **Network Rankings**: Ranking data across countries and networks
120 | - **Downloads by Sources**: Organic vs paid download attribution
121 | 
122 | ## Error Handling
123 | 
124 | The server includes comprehensive error handling with specific error types:
125 | - [`ConfigurationError`](src/index.ts:36): Missing or invalid configuration
126 | - [`SensorTowerApiError`](src/index.ts:29): API-related errors with detailed messages
127 | - Input validation using [Zod schemas](src/index.ts:836) for all parameters
128 | 
129 | ## Environment Variables
130 | 
131 | | Variable | Required | Description | Default |
132 | |----------|----------|-------------|---------|
133 | | `AUTH_TOKEN` | Yes | Sensor Tower API authentication token | - |
134 | | `SENSOR_TOWER_BASE_URL` | No | Sensor Tower API base URL | `https://api.sensortower.com` |
135 | 
136 | ## Development
137 | 
138 | ### Scripts
139 | - `npm run build`: Compile TypeScript and make executables
140 | - `npm run watch`: Watch mode for development
141 | - `npm run prepare`: Prepare package for publishing
142 | 
143 | ### Testing
144 | Use the MCP inspector for manual testing:
145 | ```bash
146 | npm run inspect
147 | ```
148 | 
149 | ## License
150 | 
151 | MIT
```

--------------------------------------------------------------------------------
/src/imagekit/README.md:
--------------------------------------------------------------------------------

```markdown
  1 | # FeedMob ImageKit MCP Server
  2 | 
  3 | Lightweight Model Context Protocol server that exposes ImageKit-related tooling via the FeedMob internal MCP stack. The starter implementation currently publishes a single arithmetic helper and is intended as a template for richer ImageKit automation.
  4 | 
  5 | ## Prerequisites
  6 | - Node.js 18+
  7 | - npm 9+
  8 | 
  9 | ## Installation
 10 | ```bash
 11 | npm install
 12 | ```
 13 | Run the command inside `src/imagekit/`. Dependencies are local to this package.
 14 | 
 15 | ## Available Scripts
 16 | - `npm run dev` — start the server with `tsx` for hot reload during development.
 17 | - `npm run dev:cli` — enter the FastMCP interactive development CLI.
 18 | - `npm run inspect` — open the FastMCP inspector to exercise the server’s tools.
 19 | - `npm run build` — compile TypeScript to `dist/` using the shared root `tsconfig.json`.
 20 | - `npm run start` — execute the compiled server from `dist/server.js` for smoke testing.
 21 | 
 22 | ## Tools
 23 | - `crop_and_watermark_image` — calls the Comet Images API to crop an input image to a supported aspect ratio, optionally adds a watermark, and returns the final image URL (ImageKit URL when uploads are enabled, otherwise the generated link).
 24 | - `upload_file` — uploads an asset to ImageKit (default provider) using base64 content, a local filesystem path, or a remote URL and returns the resulting links. Files land in the `upload/` folder and include the `upload` tag unless you override those values.
 25 | 
 26 | ### Environment Variables
 27 | 
 28 | #### ImageKit Configuration
 29 | - `IMAGEKIT_PRIVATE_KEY` — required for the `upload_file` tool and enables automatic ImageKit uploads from `crop_and_watermark_image`.
 30 |   - **Docs**: https://imagekit.io/docs/api-keys
 31 |   - Please copy the Private Key
 32 | 
 33 | #### Image Generation Provider (Comet API)
 34 | - `IMAGE_TOOL_API_KEY` — required for `crop_and_watermark_image`.
 35 |   - **Docs**: https://api.cometapi.com/doc
 36 |   - Create a new API key
 37 | - `IMAGE_TOOL_BASE_URL` — optional override for the image-generation provider base URL; defaults to `https://api.cometapi.com/v1`.
 38 | - `IMAGE_TOOL_MODEL_ID` — optional model identifier; defaults to `bytedance-seedream-4-0-250828`.
 39 |   - You can switch to another Doubao model listed at https://api.cometapi.com/pricing
 40 | 
 41 | #### Alternative Provider: Volcengine Ark (火山方舟)
 42 | - `IMAGE_TOOL_BASE_URL` — use `https://ark.cn-beijing.volces.com/api/v3` (change region if needed)
 43 | - `IMAGE_TOOL_API_KEY` — get your API key at https://console.volcengine.com/
 44 | - `IMAGE_TOOL_MODEL_ID` — recommended: `doubao-seedream-4-0-250828`
 45 |   - You can switch to another Doubao model if needed. Find more models at https://www.volcengine.com/docs/82379/1541523
 46 | 
 47 | Copy `env.sample` to `.env` when developing locally:
 48 | ```bash
 49 | cp env.sample .env
 50 | # then edit with your API key
 51 | ```
 52 | 
 53 | The server automatically loads `.env` via `dotenv` when you run any npm script.
 54 | 
 55 | #### Provider Example (Volcengine Ark / 火山方舟)
 56 | Override the defaults if you want to target Volcengine Ark:
 57 | ```
 58 | IMAGE_TOOL_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
 59 | IMAGE_TOOL_API_KEY=your-ark-api-key
 60 | IMAGE_TOOL_MODEL_ID=doubao-seedream-4-0-250828
 61 | ```
 62 | 
 63 | ### Example Invocation
 64 | From the FastMCP inspector:
 65 | ```
 66 | > crop_and_watermark_image
 67 | ? imageUrl https://example.com/image.png
 68 | ? aspectRatio 16:9
 69 | ? watermarkText FeedMob Confidential
 70 | ```
 71 | The tool returns a single URL string pointing to the resulting asset. When ImageKit credentials are configured, the URL references the uploaded asset in ImageKit; otherwise it references the link returned by the generation API.
 72 | 
 73 | Upload example:
 74 | ```
 75 | > upload_file
 76 | ? provider imagekit
 77 | ? file ./assets/banner.png
 78 | ? fileName banner.png
 79 | ? folder /marketing/campaign-2025
 80 | ```
 81 | The tool responds with a JSON summary plus resource links for the uploaded asset and its thumbnail (when provided by ImageKit).
 82 | 
 83 | Remote content upload remains supported by supplying the `file` parameter with a remote URL:
 84 | ```
 85 | > upload_file
 86 | ? provider imagekit
 87 | ? file https://ik.imagekit.io/demo/sample.jpg
 88 | ? fileName sample.jpg
 89 | ```
 90 | 
 91 | Unless overridden via the `options` object, uploads default to `useUniqueFileName: true` (avoid filename collisions) and `isPrivateFile: false` (serve public URLs).
 92 | 
 93 | ## Usage with Claude Desktop
 94 | Add the server to your Claude configuration to make the tools available to the assistant:
 95 | ```json
 96 | {
 97 |   "mcpServers": {
 98 |     "feedmob-imagekit": {
 99 |       "command": "npx",
100 |       "args": ["-y", "@feedmob/imagekit"],
101 |       "transport": "stdio",
102 |       "env": {
103 |         "IMAGE_TOOL_API_KEY": "your-image-tool-api-key",
104 |         "IMAGEKIT_PRIVATE_KEY": "your-imagekit-private-key"
105 |       }
106 |     }
107 |   }
108 | }
109 | ```
110 | Adjust the `args` to match your installation method (local path, published package, or ts-node entry point).
111 | 
112 | The server defaults to the Comet Images API (`https://api.cometapi.com/v1`) and bundled model (`bytedance-seedream-4-0-250828`). Optional overrides: add `IMAGE_TOOL_BASE_URL` and `IMAGE_TOOL_MODEL_ID` to the `env` block only when you need to swap API endpoints or models.
113 | 
114 | Volcengine Ark / 火山方舟 example:
115 | ```json
116 | {
117 |   "mcpServers": {
118 |     "feedmob-imagekit": {
119 |       "command": "npx",
120 |       "args": ["-y", "@feedmob/imagekit"],
121 |       "transport": "stdio",
122 |       "env": {
123 |         "IMAGE_TOOL_API_KEY": "your-ark-api-key",
124 |         "IMAGE_TOOL_BASE_URL": "https://ark.cn-beijing.volces.com/api/v3",
125 |         "IMAGE_TOOL_MODEL_ID": "doubao-seedream-4-0-250828",
126 |         "IMAGEKIT_PRIVATE_KEY": "your-imagekit-private-key"
127 |       }
128 |     }
129 |   }
130 | }
131 | ```
132 | 
133 | ## Development Notes
134 | - Implement new tooling in `src/tools/` and register it through `src/server.ts`; guard external inputs with `zod` schemas.
135 | - Co-locate any tests alongside the code (for example, `src/__tests__/upload.test.ts`) and wire `npm test` when the suite exists.
136 | - Keep environment-specific values outside the codebase; reach for `.env` files consumed via `dotenv` if future tools require credentials.
137 | 
```

--------------------------------------------------------------------------------
/src/n8n-nodes-feedmob-direct-spend-visualizer/AGENTS.md:
--------------------------------------------------------------------------------

```markdown
 1 | # n8n FeedMob Direct Spend Visualizer – Agent Guidelines
 2 | 
 3 | ## Build & Development Commands
 4 | - `npm install` – installs dependencies and clones the Claude plugin via postinstall hook
 5 | - `npm run build` – compiles TypeScript (target ES2020, CommonJS) and copies assets to `dist/`
 6 | - `npm run dev` – runs TypeScript compiler in watch mode for local development
 7 | - `npm run prepare` – runs build automatically before publishing
 8 | - No test suite present; manually verify by linking to local n8n (`npm link`) and testing workflows
 9 | 
10 | ## Code Style & Structure
11 | - **TypeScript**: Strict mode, ES2020 target, CommonJS modules, declaration files emitted to `dist/`
12 | - **Imports**: Use named imports from `n8n-workflow` and `@anthropic-ai/claude-agent-sdk`; Node built-ins (`fs`, `path`) imported at top
13 | - **Naming**: `camelCase` for variables/functions, `PascalCase` for classes/types, `SCREAMING_SNAKE_CASE` for constants
14 | - **Types**: Define explicit types for credentials and result shapes; use `type` for object shapes, `INodeType` and `INodeTypeDescription` from n8n-workflow
15 | - **Error Handling**: Throw descriptive errors with context (e.g., missing credentials, plugin path not found); support `continueOnFail` for batch processing
16 | - **Functions**: Extract reusable logic into private functions (`extractAssistantText`, `normalizeResult`, `tryParseJson`, `buildRuntimeEnv`, `resolvePluginPath`)
17 | - **Formatting**: Two-space indentation, semicolons required, `esModuleInterop` enabled
18 | 
19 | ## n8n Node Conventions
20 | - Place node classes in `nodes/*/` and credential classes in `credentials/`; export from `index.ts`
21 | - Node `description` object defines UI fields (`displayName`, `properties`, `credentials`)
22 | - `execute()` method processes `INodeExecutionData[]` input items and returns results array
23 | - Use `this.getNodeParameter()` and `this.getCredentials()` to access user inputs
24 | - Environment variables passed to child processes via `buildRuntimeEnv()` helper
25 | 
```

--------------------------------------------------------------------------------
/AGENTS.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Repository Guidelines
 2 | 
 3 | ## Project Structure & Module Organization
 4 | This monorepo hosts standalone MCP servers under `src/<integration-name>`. Each package keeps its own `package.json`, TypeScript sources in `src/`, and emits `dist/` when built. Shared compiler defaults live in the root `tsconfig.json`. Keep utilities local to the package that owns them and document integration specifics in that package’s README. Add tests beside the code to keep each server self-contained.
 5 | 
 6 | ## Build, Test, and Development Commands
 7 | Install dependencies inside the package you touch (for example, `cd src/imagekit && npm install`). Common scripts:
 8 | - `npm run dev` — runs `tsx src/server.ts` with hot reload.
 9 | - `npm run inspect` — opens `fastmcp inspect` for manual tool trials.
10 | - `npm run build` — compiles to `dist` and marks CLIs executable.
11 | - `npm run start` — executes the compiled output for smoke checks.
12 | Always run `npm run build` before committing so published artifacts stay up to date.
13 | 
14 | ## Coding Style & Naming Conventions
15 | Write TypeScript targeting ES2022/NodeNext with strict mode. Use two-space indentation, `camelCase` for variables and functions, `PascalCase` for types, and favour `const`. Validate untrusted input with `zod` schemas and surface actionable error messages. Load secrets through environment variables and mention required keys in the package README.
16 | 
17 | Respect the Single Responsibility Principle. When an implementation starts doing more than one thing, pull supporting logic into small private helpers (preferred) or, if multiple packages need it, a clearly named shared module. This keeps public surfaces focused and easier to test.
18 | 
19 | ## Testing Guidelines
20 | Automate coverage for new logic. Create co-located specs such as `src/tools/__tests__/upload.test.ts` and wire `npm test` to your chosen runner (Vitest or Node’s built-in test module). Stub external HTTP calls to avoid hitting partner APIs. Before opening a PR, run `npm run build && npm test` in every package you touched and note any manual checks performed.
21 | 
22 | ## Commit & Pull Request Guidelines
23 | Prefer present-tense, scoped commits like `feat(imagekit): add signed-url tool`; keep unrelated changes in separate commits. Pull requests should summarise the integration affected, link to Jira or GitHub issues, list required env vars, and attach screenshots or CLI transcripts when behaviour shifts. Request review from an engineer familiar with the server and wait for green checks before merging.
24 | 
25 | ## Security & Configuration Tips
26 | Never commit secrets. Use `.env` files loaded via `dotenv`, rotate credentials when rolling keys, and redact sensitive output from logs and pull requests.
27 | 
```

--------------------------------------------------------------------------------
/src/civitai-records/src/lib/prisma.ts:
--------------------------------------------------------------------------------

```typescript
1 | import { PrismaClient } from '@prisma/client';
2 | 
3 | export const prisma = new PrismaClient();
4 | 
```

--------------------------------------------------------------------------------
/src/n8n-nodes-sensor-tower/index.ts:
--------------------------------------------------------------------------------

```typescript
1 | export * from './nodes/SensorTower/SensorTower.node';
2 | export * from './credentials/SensorTowerApi.credentials';
3 | 
4 | 
5 | 
```

--------------------------------------------------------------------------------
/src/femini-reporting/Dockerfile:
--------------------------------------------------------------------------------

```dockerfile
 1 | FROM node:20-alpine
 2 | 
 3 | WORKDIR /app
 4 | 
 5 | COPY . .
 6 | 
 7 | RUN npm ci && npm run build
 8 | 
 9 | EXPOSE 3002
10 | 
11 | CMD ["node", "dist/index.js"]
12 | 
```

--------------------------------------------------------------------------------
/src/user-activity-reporting/tsconfig.json:
--------------------------------------------------------------------------------

```json
1 | {
2 |   "extends": "../../tsconfig.json",
3 |   "compilerOptions": {
4 |     "outDir": "./dist",
5 |     "rootDir": "./src"
6 |   },
7 |   "include": ["src/**/*"]
8 | }
9 | 
```

--------------------------------------------------------------------------------
/.claude/settings.local.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "permissions": {
 3 |     "allow": [
 4 |       "mcp__zen__chat",
 5 |       "Bash(npm run build)",
 6 |       "mcp__zen__analyze"
 7 |     ],
 8 |     "deny": []
 9 |   }
10 | }
```

--------------------------------------------------------------------------------
/src/applovin-reporting/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "extends": "../../tsconfig.json",
 3 |   "compilerOptions": {
 4 |     "outDir": "./dist",
 5 |     "rootDir": "./src",
 6 |   },
 7 |   "include": [
 8 |     "./src/**/*.ts"
 9 |   ]
10 | }
11 | 
```

--------------------------------------------------------------------------------
/src/appsamurai-reporting/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "extends": "../../tsconfig.json",
 3 |   "compilerOptions": {
 4 |     "outDir": "./dist",
 5 |     "rootDir": "./src",
 6 |   },
 7 |   "include": [
 8 |     "./src/**/*.ts"
 9 |   ]
10 | }
11 | 
```

--------------------------------------------------------------------------------
/src/feedmob-reporting/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "extends": "../../tsconfig.json",
 3 |   "compilerOptions": {
 4 |     "outDir": "./dist",
 5 |     "rootDir": "./src",
 6 |   },
 7 |   "include": [
 8 |     "./src/**/*.ts"
 9 |   ]
10 | }
11 | 
```

--------------------------------------------------------------------------------
/src/femini-reporting/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "extends": "../../tsconfig.json",
 3 |   "compilerOptions": {
 4 |     "outDir": "./dist",
 5 |     "rootDir": "./src",
 6 |   },
 7 |   "include": [
 8 |     "./src/**/*.ts"
 9 |   ]
10 | }
11 | 
```

--------------------------------------------------------------------------------
/src/impact-radius-reporting/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "extends": "../../tsconfig.json",
 3 |   "compilerOptions": {
 4 |     "outDir": "./dist",
 5 |     "rootDir": "./src",
 6 |   },
 7 |   "include": [
 8 |     "./src/**/*.ts"
 9 |   ]
10 | }
11 | 
```

--------------------------------------------------------------------------------
/src/inmobi-reporting/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "extends": "../../tsconfig.json",
 3 |   "compilerOptions": {
 4 |     "outDir": "./dist",
 5 |     "rootDir": "./src",
 6 |   },
 7 |   "include": [
 8 |     "./src/**/*.ts"
 9 |   ]
10 | }
11 | 
```

--------------------------------------------------------------------------------
/src/ironsource-aura-reporting/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "extends": "../../tsconfig.json",
 3 |   "compilerOptions": {
 4 |     "outDir": "./dist",
 5 |     "rootDir": "./src",
 6 |   },
 7 |   "include": [
 8 |     "./src/**/*.ts"
 9 |   ]
10 | }
11 | 
```

--------------------------------------------------------------------------------
/src/ironsource-reporting/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "extends": "../../tsconfig.json",
 3 |   "compilerOptions": {
 4 |     "outDir": "./dist",
 5 |     "rootDir": "./src",
 6 |   },
 7 |   "include": [
 8 |     "./src/**/*.ts"
 9 |   ]
10 | }
11 | 
```

--------------------------------------------------------------------------------
/src/jampp-reporting/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "extends": "../../tsconfig.json",
 3 |   "compilerOptions": {
 4 |     "outDir": "./dist",
 5 |     "rootDir": "./src",
 6 |   },
 7 |   "include": [
 8 |     "./src/**/*.ts"
 9 |   ]
10 | }
11 | 
```

--------------------------------------------------------------------------------
/src/kayzen-reporting/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "extends": "../../tsconfig.json",
 3 |   "compilerOptions": {
 4 |     "outDir": "./dist",
 5 |     "rootDir": "./src",
 6 |   },
 7 |   "include": [
 8 |     "./src/**/*.ts"
 9 |   ]
10 | }
11 | 
```

--------------------------------------------------------------------------------
/src/liftoff-reporting/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "extends": "../../tsconfig.json",
 3 |   "compilerOptions": {
 4 |     "outDir": "./dist",
 5 |     "rootDir": "./src",
 6 |   },
 7 |   "include": [
 8 |     "./src/**/*.ts"
 9 |   ]
10 | }
11 | 
```

--------------------------------------------------------------------------------
/src/mintegral-reporting/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "extends": "../../tsconfig.json",
 3 |   "compilerOptions": {
 4 |     "outDir": "./dist",
 5 |     "rootDir": "./src",
 6 |   },
 7 |   "include": [
 8 |     "./src/**/*.ts"
 9 |   ]
10 | }
11 | 
```

--------------------------------------------------------------------------------
/src/rtb-house-reporting/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "extends": "../../tsconfig.json",
 3 |   "compilerOptions": {
 4 |     "outDir": "./dist",
 5 |     "rootDir": "./src",
 6 |   },
 7 |   "include": [
 8 |     "./src/**/*.ts"
 9 |   ]
10 | }
11 | 
```

--------------------------------------------------------------------------------
/src/samsung-reporting/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "extends": "../../tsconfig.json",
 3 |   "compilerOptions": {
 4 |     "outDir": "./dist",
 5 |     "rootDir": "./src",
 6 |   },
 7 |   "include": [
 8 |     "./src/**/*.ts"
 9 |   ]
10 | }
11 | 
```

--------------------------------------------------------------------------------
/src/sensor-tower-reporting/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "extends": "../../tsconfig.json",
 3 |   "compilerOptions": {
 4 |     "outDir": "./dist",
 5 |     "rootDir": "./src",
 6 |   },
 7 |   "include": [
 8 |     "./src/**/*.ts"
 9 |   ]
10 | }
11 | 
```

--------------------------------------------------------------------------------
/src/singular-reporting/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "extends": "../../tsconfig.json",
 3 |   "compilerOptions": {
 4 |     "outDir": "./dist",
 5 |     "rootDir": "./src",
 6 |   },
 7 |   "include": [
 8 |     "./src/**/*.ts"
 9 |   ]
10 | }
11 | 
```

--------------------------------------------------------------------------------
/src/smadex-reporting/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "extends": "../../tsconfig.json",
 3 |   "compilerOptions": {
 4 |     "outDir": "./dist",
 5 |     "rootDir": "./src",
 6 |   },
 7 |   "include": [
 8 |     "./src/**/*.ts"
 9 |   ]
10 | }
11 | 
```

--------------------------------------------------------------------------------
/src/tapjoy-reporting/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "extends": "../../tsconfig.json",
 3 |   "compilerOptions": {
 4 |     "outDir": "./dist",
 5 |     "rootDir": "./src",
 6 |   },
 7 |   "include": [
 8 |     "./src/**/*.ts"
 9 |   ]
10 | }
11 | 
```

--------------------------------------------------------------------------------
/src/work-journals/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "extends": "../../tsconfig.json",
 3 |   "compilerOptions": {
 4 |     "outDir": "./dist",
 5 |     "rootDir": "./src",
 6 |   },
 7 |   "include": [
 8 |     "./src/**/*.ts"
 9 |   ]
10 | }
11 | 
```

--------------------------------------------------------------------------------
/src/n8n-nodes-feedmob-direct-spend-visualizer/index.ts:
--------------------------------------------------------------------------------

```typescript
1 | export * from './nodes/FeedmobDirectSpendVisualizer/FeedmobDirectSpendVisualizer.node';
2 | export * from './credentials/FeedmobDirectSpendVisualizerApi.credentials';
3 | 
4 | 
```

--------------------------------------------------------------------------------
/src/github-issues/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |     "extends": "../../tsconfig.json",
 3 |     "compilerOptions": {
 4 |       "outDir": "./dist",
 5 |       "rootDir": "."
 6 |     },
 7 |     "include": [
 8 |       "./**/*.ts"
 9 |     ]
10 |   }
11 |   
```

--------------------------------------------------------------------------------
/src/github-issues/common/version.ts:
--------------------------------------------------------------------------------

```typescript
1 | // If the format of this file changes, so it doesn't simply export a VERSION constant,
2 | // this will break .github/workflows/version-check.yml.
3 | export const VERSION = "0.0.5";
4 | 
```

--------------------------------------------------------------------------------
/src/n8n-nodes-sensor-tower/nodes/SensorTower/logo.svg:
--------------------------------------------------------------------------------

```
1 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
2 |   <circle cx="50" cy="50" r="45" fill="#2CDBA6"/>
3 |   <rect x="45" y="25" width="10" height="50" rx="2" fill="#0F8C6A"/>
4 |   <circle cx="50" cy="25" r="6" fill="#0F8C6A"/>
5 | </svg>
6 | 
7 | 
8 | 
```

--------------------------------------------------------------------------------
/src/civitai-records/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "compilerOptions": {
 3 |     "target": "ES2022",
 4 |     "module": "NodeNext",
 5 |     "moduleResolution": "NodeNext",
 6 |     "outDir": "./dist",
 7 |     "rootDir": "./src",
 8 |     "strict": true,
 9 |     "esModuleInterop": true,
10 |     "skipLibCheck": true
11 |   },
12 |   "include": ["src/**/*"]
13 | }
14 | 
```

--------------------------------------------------------------------------------
/src/imagekit/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | 
 2 | {
 3 |   "compilerOptions": {
 4 |     "target": "ES2022",
 5 |     "module": "NodeNext",
 6 |     "moduleResolution": "NodeNext",
 7 |     "outDir": "./dist",
 8 |     "rootDir": "./src",
 9 |     "strict": true,
10 |     "esModuleInterop": true,
11 |     "skipLibCheck": true
12 |   },
13 |   "include": ["src/**/*"]
14 | }
15 | 
16 | 
```

--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "compilerOptions": {
 3 |     "target": "ES2022",
 4 |     "module": "NodeNext",
 5 |     "moduleResolution": "NodeNext",
 6 |     "strict": true,
 7 |     "esModuleInterop": true,
 8 |     "skipLibCheck": true,
 9 |     "forceConsistentCasingInFileNames": true,
10 |     "resolveJsonModule": true
11 |   },
12 |   "include": ["src/**/*"],
13 |   "exclude": ["node_modules"]
14 | }
15 | 
```

--------------------------------------------------------------------------------
/src/civitai-records/infra/db-init/03_init.sql:
--------------------------------------------------------------------------------

```sql
1 | -- =========================================================
2 | -- 03_init.sql
3 | -- Seed / create example users using the helper
4 | -- (Change passwords before real use)
5 | -- =========================================================
6 | 
7 | SELECT civitai.create_app_user('richard', 'richard_password');
8 | SELECT civitai.create_app_user('alice',   'alice_password');
9 | 
```

--------------------------------------------------------------------------------
/src/civitai-records/build.sh:
--------------------------------------------------------------------------------

```bash
 1 | #!/bin/bash
 2 | 
 3 | # Exit on error
 4 | set -e
 5 | 
 6 | echo "🔨 Building civitai-records..."
 7 | 
 8 | # Generate Prisma client
 9 | echo "📦 Generating Prisma client..."
10 | prisma generate
11 | 
12 | # Compile TypeScript
13 | echo "🔧 Compiling TypeScript..."
14 | tsc
15 | 
16 | # Copy markdown documentation
17 | echo "📄 Copying markdown documentation..."
18 | mkdir -p dist/prompts
19 | cp src/prompts/*.md dist/prompts/
20 | 
21 | echo "✅ Build complete!"
22 | 
```

--------------------------------------------------------------------------------
/src/civitai-records/docker-compose.yml:
--------------------------------------------------------------------------------

```yaml
 1 | services:
 2 |   db:
 3 |     image: postgres:16
 4 |     container_name: civitai-db
 5 |     restart: unless-stopped
 6 |     environment:
 7 |       POSTGRES_USER: postgres
 8 |       POSTGRES_PASSWORD: postgres
 9 |       POSTGRES_DB: civitai
10 |     ports:
11 |       - "5432:5432"
12 |     volumes:
13 |       - ./infra/db-init:/docker-entrypoint-initdb.d
14 |       - civitai_data:/var/lib/postgresql/data
15 | 
16 | volumes:
17 |   civitai_data:
18 | 
```

--------------------------------------------------------------------------------
/src/n8n-nodes-feedmob-direct-spend-visualizer/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "compilerOptions": {
 3 |     "target": "ES2020",
 4 |     "module": "CommonJS",
 5 |     "moduleResolution": "Node",
 6 |     "declaration": true,
 7 |     "outDir": "dist",
 8 |     "rootDir": ".",
 9 |     "strict": true,
10 |     "esModuleInterop": true,
11 |     "skipLibCheck": true,
12 |     "forceConsistentCasingInFileNames": true
13 |   },
14 |   "include": [
15 |     "nodes/**/*.ts",
16 |     "credentials/**/*.ts",
17 |     "index.ts",
18 |     "types.d.ts"
19 |   ]
20 | }
21 | 
22 | 
23 | 
```

--------------------------------------------------------------------------------
/src/n8n-nodes-sensor-tower/tsconfig.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "compilerOptions": {
 3 |     "target": "ES2020",
 4 |     "module": "CommonJS",
 5 |     "moduleResolution": "Node",
 6 |     "declaration": true,
 7 |     "outDir": "dist",
 8 |     "rootDir": ".",
 9 |     "strict": true,
10 |     "esModuleInterop": true,
11 |     "skipLibCheck": true,
12 |     "forceConsistentCasingInFileNames": true
13 |   },
14 |   "include": [
15 |     "nodes/**/*.ts",
16 |     "credentials/**/*.ts",
17 |     "index.ts",
18 |     "types.d.ts"
19 |   ]
20 | }
21 | 
22 | 
23 | 
```

--------------------------------------------------------------------------------
/src/civitai-records/infra/db-init/13_add_columns_to_asset_stats.sql:
--------------------------------------------------------------------------------

```sql
 1 | -- =========================================================
 2 | -- 13_add_columns_to_asset_stats.sql
 3 | -- Add civitai_created_at, civitai_account, post_id, and on_behalf_of columns to asset_stats
 4 | -- =========================================================
 5 | 
 6 | SET ROLE civitai_owner;
 7 | 
 8 | ALTER TABLE civitai.asset_stats 
 9 |   ADD COLUMN post_id bigint REFERENCES civitai.civitai_posts(id),
10 |   ADD COLUMN civitai_created_at timestamptz,
11 |   ADD COLUMN civitai_account text,
12 |   ADD COLUMN on_behalf_of text;
13 | 
14 | RESET ROLE;
15 | 
```

--------------------------------------------------------------------------------
/src/n8n-nodes-feedmob-direct-spend-visualizer/nodes/FeedmobDirectSpendVisualizer/logo.svg:
--------------------------------------------------------------------------------

```
 1 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96">
 2 |   <defs>
 3 |     <linearGradient id="grad" x1="0%" y1="0%" x2="100%" y2="100%">
 4 |       <stop offset="0%" stop-color="#08BFB0"/>
 5 |       <stop offset="100%" stop-color="#0560A4"/>
 6 |     </linearGradient>
 7 |   </defs>
 8 |   <rect x="6" y="6" width="84" height="84" rx="18" fill="#041F2F"/>
 9 |   <path d="M18 66h12v16H18zM36 52h12v30H36zM54 40h12v42H54zM72 24h12v58H72z" fill="url(#grad)"/>
10 |   <circle cx="30" cy="34" r="6" fill="#FCB045"/>
11 |   <circle cx="60" cy="22" r="5" fill="#FCB045"/>
12 | </svg>
13 | 
14 | 
```

--------------------------------------------------------------------------------
/src/civitai-records/infra/db-init/10_update_on_behalf_of_for_existing_records.sql:
--------------------------------------------------------------------------------

```sql
 1 | -- =========================================================
 2 | -- 10_update_on_behalf_of_for_existing_records.sql
 3 | -- =========================================================
 4 | 
 5 | SET ROLE civitai_owner;
 6 | 
 7 | -- Backfill existing rows: set on_behalf_of to created_by for historical data
 8 | UPDATE civitai.prompts SET on_behalf_of = created_by WHERE on_behalf_of IS NULL;
 9 | UPDATE civitai.assets SET on_behalf_of = created_by WHERE on_behalf_of IS NULL;
10 | UPDATE civitai.civitai_posts SET on_behalf_of = created_by WHERE on_behalf_of IS NULL;
11 | 
12 | RESET ROLE;
13 | 
```

--------------------------------------------------------------------------------
/src/civitai-records/src/prompts/recordCivitaiWorkflow.ts:
--------------------------------------------------------------------------------

```typescript
 1 | import * as fs from "fs";
 2 | import * as path from "path";
 3 | import { fileURLToPath } from "url";
 4 | 
 5 | const __filename = fileURLToPath(import.meta.url);
 6 | const __dirname = path.dirname(__filename);
 7 | 
 8 | export const recordCivitaiWorkflowPrompt = {
 9 |   name: "record_civitai_workflow",
10 |   description: "Guide for properly recording Civitai posts, prompts, and assets in the correct order",
11 |   load: async () => {
12 |     const workflowContent = await fs.promises.readFile(
13 |       path.join(__dirname, "record-civitai-workflow.md"),
14 |       "utf-8"
15 |     );
16 |     return workflowContent;
17 |   },
18 | };
19 | 
```

--------------------------------------------------------------------------------
/src/n8n-nodes-sensor-tower/credentials/SensorTowerApi.credentials.ts:
--------------------------------------------------------------------------------

```typescript
 1 | import type { INodeProperties } from 'n8n-workflow';
 2 | 
 3 | export class SensorTowerApi {
 4 |   name = 'sensorTowerApi';
 5 |   displayName = 'Sensor Tower API';
 6 |   properties: INodeProperties[] = [
 7 |     {
 8 |       displayName: 'Base URL',
 9 |       name: 'baseUrl',
10 |       type: 'string',
11 |       default: 'https://api.sensortower.com',
12 |       description: 'Base URL for Sensor Tower API',
13 |       required: true,
14 |     },
15 |     {
16 |       displayName: 'Auth Token (AUTH_TOKEN)',
17 |       name: 'authToken',
18 |       type: 'string',
19 |       typeOptions: { password: true },
20 |       default: '',
21 |       required: true,
22 |     },
23 |   ];
24 | }
25 | 
26 | 
27 | 
```

--------------------------------------------------------------------------------
/src/civitai-records/src/prompts/civitaiMediaEngagement.ts:
--------------------------------------------------------------------------------

```typescript
 1 | import * as fs from "fs";
 2 | import * as path from "path";
 3 | import { fileURLToPath } from "url";
 4 | 
 5 | const __filename = fileURLToPath(import.meta.url);
 6 | const __dirname = path.dirname(__filename);
 7 | 
 8 | export const civitaiMediaEngagementPrompt = {
 9 |   name: "civitai_media_engagement",
10 |   description: "Guide for finding and analyzing Civitai media (videos and images) engagement metrics using find_asset, list_civitai_posts, and fetch_civitai_post_assets",
11 |   load: async () => {
12 |     const content = await fs.promises.readFile(
13 |       path.join(__dirname, "civitai-media-engagement.md"),
14 |       "utf-8"
15 |     );
16 |     return content;
17 |   },
18 | };
19 | 
```

--------------------------------------------------------------------------------
/src/imagekit/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@feedmob/imagekit",
 3 |   "version": "1.0.2",
 4 |   "description": "FeedMob MCP server for ImageKit uploads, cropping, and watermarking.",
 5 |   "main": "dist/server.js",
 6 |   "bin": "dist/server.js",
 7 |   "scripts": {
 8 |     "build": "tsc",
 9 |     "dev": "tsx src/server.ts",
10 |     "start": "node dist/server.js",
11 |     "inspect": "fastmcp inspect src/server.ts",
12 |     "dev:cli": "fastmcp dev src/server.ts",
13 |     "test": "echo \"Error: no test specified\" && exit 1"
14 |   },
15 |   "keywords": [],
16 |   "author": "FeedMob",
17 |   "license": "MIT",
18 |   "type": "module",
19 |   "dependencies": {
20 |     "@imagekit/nodejs": "^7.1.0",
21 |     "@modelcontextprotocol/sdk": "^1.19.1",
22 |     "dotenv": "^17.2.3",
23 |     "fastmcp": "^3.19.0",
24 |     "zod": "^3.25.76"
25 |   },
26 |   "devDependencies": {
27 |     "@types/node": "^24.6.2",
28 |     "tsx": "^4.20.6",
29 |     "typescript": "^5.9.3"
30 |   }
31 | }
32 | 
```

--------------------------------------------------------------------------------
/src/liftoff-reporting/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@feedmob/liftoff-reporting",
 3 |   "version": "0.0.3",
 4 |   "description": "MCP Server for Liftoff Reporting API",
 5 |   "main": "dist/index.js",
 6 |   "type": "module",
 7 |   "bin": {
 8 |     "liftoff-reporting": "dist/index.js"
 9 |   },
10 |   "scripts": {
11 |     "build": "tsc && shx chmod +x dist/*.js",
12 |     "prepare": "npm run build",
13 |     "watch": "tsc --watch"
14 |   },
15 |   "files": [
16 |     "dist",
17 |     "README.md"
18 |   ],
19 |   "keywords": [
20 |     "mcp",
21 |     "appsamurai"
22 |   ],
23 |   "author": "FeedMob",
24 |   "homepage": "https://github.com/feed-mob/fm-mcp-servers",
25 |   "bugs": "https://github.com/feed-mob/fm-mcp-servers/issues",
26 |   "license": "MIT",
27 |   "dependencies": {
28 |     "@modelcontextprotocol/sdk": "^1.7.0",
29 |     "axios": "^1.7.2",
30 |     "dotenv": "^16.4.5",
31 |     "zod": "^3.23.8"
32 |   },
33 |   "devDependencies": {
34 |     "@types/node": "^20.14.9",
35 |     "typescript": "^5.5.2",
36 |     "shx": "^0.3.4"
37 |   }
38 | }
39 | 
```

--------------------------------------------------------------------------------
/src/kayzen-reporting/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@feedmob/kayzen-reporting",
 3 |   "version": "0.1.0",
 4 |   "description": "MCP server for Kayzen API",
 5 |   "main": "dist/index.js",
 6 |   "author": "FeedMob",
 7 |   "license": "MIT",
 8 |   "homepage": "https://github.com/feed-mob/fm-mcp-servers",
 9 |   "bugs": "https://github.com/feed-mob/fm-mcp-servers/issues",
10 |   "type": "module",
11 |   "bin": {
12 |     "kayzen-reporting": "dist/index.js"
13 |   },
14 |   "files": [
15 |     "dist"
16 |   ],
17 |   "keywords": [
18 |     "mcp",
19 |     "kayzen",
20 |     "reporting"
21 |   ],
22 |   "scripts": {
23 |     "build": "tsc && shx chmod +x dist/*.js",
24 |     "prepare": "npm run build",
25 |     "watch": "tsc --watch"
26 |   },
27 |   "dependencies": {
28 |     "@modelcontextprotocol/sdk": "^1.7.0",
29 |     "axios": "^1.8.3",
30 |     "dotenv": "^16.4.7",
31 |     "zod": "^3.24.2"
32 |   },
33 |   "devDependencies": {
34 |     "@types/node": "^20.17.24",
35 |     "ts-node": "^10.9.2",
36 |     "typescript": "^5.8.2",
37 |     "shx": "^0.3.4"
38 |   }
39 | }
40 | 
```

--------------------------------------------------------------------------------
/src/appsamurai-reporting/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@feedmob/appsamurai-reporting",
 3 |   "version": "0.0.5",
 4 |   "description": "MCP Server for AppSamurai Campaign Spend API",
 5 |   "main": "dist/index.js",
 6 |   "type": "module",
 7 |   "bin": {
 8 |     "appsamurai-reporting": "dist/index.js"
 9 |   },
10 |   "scripts": {
11 |     "build": "tsc && shx chmod +x dist/*.js",
12 |     "prepare": "npm run build",
13 |     "watch": "tsc --watch"
14 |   },
15 |   "files": [
16 |     "dist",
17 |     "README.md"
18 |   ],
19 |   "keywords": [
20 |     "mcp",
21 |     "appsamurai"
22 |   ],
23 |   "author": "FeedMob",
24 |   "homepage": "https://github.com/feed-mob/fm-mcp-servers",
25 |   "bugs": "https://github.com/feed-mob/fm-mcp-servers/issues",
26 |   "license": "MIT",
27 |   "dependencies": {
28 |     "@modelcontextprotocol/sdk": "^1.7.0",
29 |     "axios": "^1.7.2",
30 |     "dotenv": "^16.4.5",
31 |     "zod": "^3.23.8"
32 |   },
33 |   "devDependencies": {
34 |     "@types/node": "^20.14.9",
35 |     "typescript": "^5.5.2",
36 |     "shx": "^0.3.4"
37 |   }
38 | }
39 | 
```

--------------------------------------------------------------------------------
/src/work-journals/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@feedmob/work-journals",
 3 |   "version": "0.0.1",
 4 |   "description": "This is an MCP server for querying and managing work journals.",
 5 |   "main": "src/index.ts",
 6 |   "homepage": "https://github.com/feed-mob/fm-mcp-servers",
 7 |   "bugs": "https://github.com/feed-mob/fm-mcp-servers/issues",
 8 |   "type": "module",
 9 |   "bin": {
10 |     "work-journals": "dist/index.js"
11 |   },
12 |   "scripts": {
13 |     "build": "tsc && shx chmod +x dist/*.js",
14 |     "prepare": "npm run build",
15 |     "watch": "tsc --watch"
16 |   },
17 |   "keywords": [
18 |     "mcp",
19 |     "work-journals"
20 |   ],
21 |   "files": [
22 |     "dist",
23 |     "README.md"
24 |   ],
25 |   "author": "FeedMob",
26 |   "license": "ISC",
27 |   "dependencies": {
28 |     "fastmcp": "*",
29 |     "zod": "^3.23.8",
30 |     "date-fns": "^4.1.0"
31 |   },
32 |   "devDependencies": {
33 |     "@types/node": "^24.0.10",
34 |     "shx": "^0.3.4",
35 |     "typescript": "^5.5.3"
36 |   },
37 |   "engines": {
38 |     "node": ">=16.0.0"
39 |   }
40 | }
41 | 
```

--------------------------------------------------------------------------------
/src/civitai-records/infra/db-init/08_migration_add_on_behalf_of.sql:
--------------------------------------------------------------------------------

```sql
 1 | -- =========================================================
 2 | -- 08_migration_add_on_behalf_of.sql
 3 | -- Add on_behalf_of column to existing production tables
 4 | -- Note: Fresh installs already have this column in scripts 04, 05, 06
 5 | -- =========================================================
 6 | 
 7 | SET ROLE civitai_owner;
 8 | 
 9 | -- Add on_behalf_of column to all tables (nullable, will be populated by trigger)
10 | ALTER TABLE civitai.prompts ADD COLUMN on_behalf_of TEXT NULL;
11 | ALTER TABLE civitai.assets ADD COLUMN on_behalf_of TEXT NULL;
12 | ALTER TABLE civitai.civitai_posts ADD COLUMN on_behalf_of TEXT NULL;
13 | 
14 | -- Create indexes for efficient filtering by on_behalf_of
15 | CREATE INDEX prompts_on_behalf_of_idx ON civitai.prompts(on_behalf_of);
16 | CREATE INDEX assets_on_behalf_of_idx ON civitai.assets(on_behalf_of);
17 | CREATE INDEX civitai_posts_on_behalf_of_idx ON civitai.civitai_posts(on_behalf_of);
18 | 
19 | RESET ROLE;
20 | 
```

--------------------------------------------------------------------------------
/src/github-issues/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@feedmob/github-issues",
 3 |   "version": "0.0.5",
 4 |   "description": "MCP server for using the GitHub API",
 5 |   "license": "MIT",
 6 |   "author": "FeedMob",
 7 |   "homepage": "https://github.com/feedmob/fm-mcp-servers",
 8 |   "bugs": "https://github.com/feedmob/fm-mcp-servers/issues",
 9 |   "type": "module",
10 |   "bin": {
11 |     "mcp-server-github": "dist/index.js"
12 |   },
13 |   "files": [
14 |     "dist"
15 |   ],
16 |   "scripts": {
17 |     "build": "tsc && shx chmod +x dist/*.js",
18 |     "prepare": "npm run build",
19 |     "watch": "tsc --watch"
20 |   },
21 |   "dependencies": {
22 |     "date-fns": "^4.1.0",
23 |     "fastmcp": "2.1.0",
24 |     "@modelcontextprotocol/sdk": "1.0.1",
25 |     "@types/node": "^22",
26 |     "@types/node-fetch": "^2.6.12",
27 |     "node-fetch": "^3.3.2",
28 |     "universal-user-agent": "^7.0.2",
29 |     "zod": "^3.22.4",
30 |     "zod-to-json-schema": "^3.23.5"
31 |   },
32 |   "devDependencies": {
33 |     "shx": "^0.3.4",
34 |     "typescript": "^5.6.2"
35 |   }
36 | }
37 | 
```

--------------------------------------------------------------------------------
/src/civitai-records/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@feedmob/civitai-records",
 3 |   "version": "0.1.14",
 4 |   "description": "FeedMob FastMCP server scaffold for Civitai record utilities.",
 5 |   "main": "dist/server.js",
 6 |   "bin": "dist/server.js",
 7 |   "scripts": {
 8 |     "postinstall": "prisma generate",
 9 |     "build": "./build.sh",
10 |     "dev": "tsx src/server.ts",
11 |     "start": "node dist/server.js",
12 |     "inspect": "fastmcp inspect src/server.ts",
13 |     "dev:cli": "fastmcp dev src/server.ts",
14 |     "test": "tsx --test"
15 |   },
16 |   "keywords": [],
17 |   "author": "FeedMob",
18 |   "license": "MIT",
19 |   "type": "module",
20 |   "files": [
21 |     "dist/",
22 |     "prisma/"
23 |   ],
24 |   "dependencies": {
25 |     "@modelcontextprotocol/sdk": "^1.19.1",
26 |     "@prisma/client": "^6.18.0",
27 |     "dotenv": "^17.2.3",
28 |     "fastmcp": "^3.25.4",
29 |     "prisma": "^6.18.0",
30 |     "zod": "^3.25.76"
31 |   },
32 |   "devDependencies": {
33 |     "@types/node": "^24.6.2",
34 |     "tsx": "^4.20.6",
35 |     "typescript": "^5.9.3"
36 |   }
37 | }
38 | 
```

--------------------------------------------------------------------------------
/src/inmobi-reporting/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@feedmob/inmobi-reporting",
 3 |   "version": "0.0.1",
 4 |   "description": "MCP server for Inmobi API",
 5 |   "main": "dist/index.js",
 6 |   "author": "FeedMob",
 7 |   "homepage": "https://github.com/feed-mob/fm-mcp-servers",
 8 |   "bugs": "https://github.com/feed-mob/fm-mcp-servers/issues",
 9 |   "type": "module",
10 |   "bin": {
11 |     "inmobi-reporting": "dist/index.js"
12 |   },
13 |   "files": [
14 |     "dist",
15 |     "README.md"
16 |   ],
17 |   "keywords": [
18 |     "mcp",
19 |     "inmobi"
20 |   ],
21 |   "scripts": {
22 |     "build": "tsc && shx chmod +x dist/*.js",
23 |     "prepare": "npm run build",
24 |     "watch": "tsc --watch"
25 |   },
26 |   "engines": {
27 |     "node": ">=16.0.0"
28 |   },
29 |   "dependencies": {
30 |     "@modelcontextprotocol/sdk": "^1.7.0",
31 |     "dotenv": "^16.4.7",
32 |     "node-fetch": "^2.7.0",
33 |     "zod": "^3.24.2"
34 |   },
35 |   "devDependencies": {
36 |     "@types/node": "^22.13.10",
37 |     "@types/node-fetch": "^2.6.12",
38 |     "ts-node": "^10.9.2",
39 |     "shx": "^0.3.4",
40 |     "typescript": "^5.8.2"
41 |   }
42 | }
43 | 
```

--------------------------------------------------------------------------------
/src/smadex-reporting/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@feedmob/smadex-reporting",
 3 |   "version": "0.0.1",
 4 |   "description": "MCP server for Smadex API",
 5 |   "main": "dist/index.js",
 6 |   "author": "FeedMob",
 7 |   "homepage": "https://github.com/feed-mob/fm-mcp-servers",
 8 |   "bugs": "https://github.com/feed-mob/fm-mcp-servers/issues",
 9 |   "type": "module",
10 |   "bin": {
11 |     "smadex-reporting": "dist/index.js"
12 |   },
13 |   "files": [
14 |     "dist",
15 |     "README.md"
16 |   ],
17 |   "keywords": [
18 |     "mcp",
19 |     "smadex"
20 |   ],
21 |   "scripts": {
22 |     "build": "tsc && shx chmod +x dist/*.js",
23 |     "prepare": "npm run build",
24 |     "watch": "tsc --watch"
25 |   },
26 |   "engines": {
27 |     "node": ">=16.0.0"
28 |   },
29 |   "dependencies": {
30 |     "@modelcontextprotocol/sdk": "^1.7.0",
31 |     "dotenv": "^16.4.7",
32 |     "node-fetch": "^2.7.0",
33 |     "zod": "^3.24.2"
34 |   },
35 |   "devDependencies": {
36 |     "@types/node": "^22.15.21",
37 |     "@types/node-fetch": "^2.6.12",
38 |     "shx": "^0.3.4",
39 |     "ts-node": "^10.9.2",
40 |     "typescript": "^5.8.2"
41 |   }
42 | }
43 | 
```

--------------------------------------------------------------------------------
/src/tapjoy-reporting/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@feedmob/tapjoy-reporting",
 3 |   "version": "0.0.5",
 4 |   "description": "MCP server for Tapjoy API",
 5 |   "main": "dist/index.js",
 6 |   "author": "FeedMob",
 7 |   "homepage": "https://github.com/feed-mob/fm-mcp-servers",
 8 |   "bugs": "https://github.com/feed-mob/fm-mcp-servers/issues",
 9 |   "type": "module",
10 |   "bin": {
11 |     "tapjoy-reporting": "dist/index.js"
12 |   },
13 |   "files": [
14 |     "dist",
15 |     "README.md"
16 |   ],
17 |   "keywords": [
18 |     "mcp",
19 |     "tapjoy"
20 |   ],
21 |   "scripts": {
22 |     "build": "tsc && shx chmod +x dist/*.js",
23 |     "prepare": "npm run build",
24 |     "watch": "tsc --watch"
25 |   },
26 |   "engines": {
27 |     "node": ">=16.0.0"
28 |   },
29 |   "dependencies": {
30 |     "@modelcontextprotocol/sdk": "^1.7.0",
31 |     "dotenv": "^16.4.7",
32 |     "node-fetch": "^2.7.0",
33 |     "zod": "^3.24.2"
34 |   },
35 |   "devDependencies": {
36 |     "@types/node": "^22.13.10",
37 |     "@types/node-fetch": "^2.6.12",
38 |     "ts-node": "^10.9.2",
39 |     "shx": "^0.3.4",
40 |     "typescript": "^5.8.2"
41 |   }
42 | }
43 | 
```

--------------------------------------------------------------------------------
/src/feedmob-reporting/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@feedmob/feedmob-reporting",
 3 |   "version": "0.0.7",
 4 |   "description": "MCP Server for FeedMob Spend API",
 5 |   "main": "dist/index.js",
 6 |   "type": "module",
 7 |   "bin": {
 8 |     "feedmob-reporting": "dist/index.js"
 9 |   },
10 |   "scripts": {
11 |     "build": "tsc && shx chmod +x dist/*.js",
12 |     "prepare": "npm run build",
13 |     "watch": "tsc --watch"
14 |   },
15 |   "files": [
16 |     "dist",
17 |     "README.md"
18 |   ],
19 |   "keywords": [
20 |     "mcp",
21 |     "feedmob",
22 |     "reporting"
23 |   ],
24 |   "author": "FeedMob",
25 |   "homepage": "https://github.com/feed-mob/fm-mcp-servers",
26 |   "bugs": "https://github.com/feed-mob/fm-mcp-servers/issues",
27 |   "license": "MIT",
28 |   "dependencies": {
29 |     "@modelcontextprotocol/sdk": "^1.7.0",
30 |     "axios": "^1.7.2",
31 |     "dotenv": "^16.4.5",
32 |     "jsonwebtoken": "^9.0.0",
33 |     "zod": "^3.23.8"
34 |   },
35 |   "devDependencies": {
36 |     "@types/jsonwebtoken": "^9.0.0",
37 |     "@types/node": "^20.14.9",
38 |     "typescript": "^5.5.2",
39 |     "shx": "^0.3.4"
40 |   }
41 | }
42 | 
```

--------------------------------------------------------------------------------
/.github/workflows/publish-imagekit.yml:
--------------------------------------------------------------------------------

```yaml
 1 | name: Publish ImageKit Package
 2 | 
 3 | on:
 4 |   push:
 5 |     branches:
 6 |       - main
 7 |     paths:
 8 |       - 'src/imagekit/**'
 9 |   workflow_dispatch:
10 |     inputs:
11 |       publish:
12 |         description: 'Confirm publishing ImageKit package'
13 |         required: true
14 |         type: boolean
15 |         default: false
16 | 
17 | jobs:
18 |   publish:
19 |     runs-on: ubuntu-latest
20 |     if: ${{ github.event_name == 'push' || github.event.inputs.publish == 'true' }}
21 |     defaults:
22 |       run:
23 |         working-directory: src/imagekit
24 | 
25 |     steps:
26 |       - uses: actions/checkout@v4
27 | 
28 |       - name: Setup Node.js
29 |         uses: actions/setup-node@v4
30 |         with:
31 |           node-version: '20'
32 |           registry-url: 'https://registry.npmjs.org'
33 | 
34 |       - name: Install dependencies
35 |         run: npm ci
36 | 
37 |       - name: Build
38 |         run: npm run build
39 | 
40 |       - name: Publish to npm
41 |         run: npm publish --access public
42 |         env:
43 |           NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTOMATION_TOKEN }}
44 | 
```

--------------------------------------------------------------------------------
/src/applovin-reporting/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@feedmob/applovin-reporting",
 3 |   "version": "0.0.1",
 4 |   "description": "MCP server for Applovin API",
 5 |   "main": "dist/index.js",
 6 |   "author": "FeedMob",
 7 |   "homepage": "https://github.com/feed-mob/fm-mcp-servers",
 8 |   "bugs": "https://github.com/feed-mob/fm-mcp-servers/issues",
 9 |   "type": "module",
10 |   "bin": {
11 |     "applovin-reporting": "dist/index.js"
12 |   },
13 |   "files": [
14 |     "dist",
15 |     "README.md"
16 |   ],
17 |   "keywords": [
18 |     "mcp",
19 |     "applovin"
20 |   ],
21 |   "scripts": {
22 |     "build": "tsc && shx chmod +x dist/*.js",
23 |     "prepare": "npm run build",
24 |     "watch": "tsc --watch"
25 |   },
26 |   "engines": {
27 |     "node": ">=16.0.0"
28 |   },
29 |   "dependencies": {
30 |     "@modelcontextprotocol/sdk": "^1.7.0",
31 |     "dotenv": "^16.4.7",
32 |     "node-fetch": "^2.7.0",
33 |     "zod": "^3.24.2"
34 |   },
35 |   "devDependencies": {
36 |     "@types/node": "^22.13.10",
37 |     "@types/node-fetch": "^2.6.12",
38 |     "ts-node": "^10.9.2",
39 |     "shx": "^0.3.4",
40 |     "typescript": "^5.8.2"
41 |   }
42 | }
43 | 
```

--------------------------------------------------------------------------------
/src/ironsource-reporting/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@feedmob/ironsource-reporting",
 3 |   "version": "0.0.1",
 4 |   "description": "MCP server for IronSource API",
 5 |   "main": "dist/index.js",
 6 |   "author": "FeedMob",
 7 |   "homepage": "https://github.com/feed-mob/fm-mcp-servers",
 8 |   "bugs": "https://github.com/feed-mob/fm-mcp-servers/issues",
 9 |   "type": "module",
10 |   "bin": {
11 |     "ironsource-reporting": "dist/index.js"
12 |   },
13 |   "files": [
14 |     "dist",
15 |     "README.md"
16 |   ],
17 |   "keywords": [
18 |     "mcp",
19 |     "ironsource"
20 |   ],
21 |   "scripts": {
22 |     "build": "tsc && shx chmod +x dist/*.js",
23 |     "prepare": "npm run build",
24 |     "watch": "tsc --watch"
25 |   },
26 |   "engines": {
27 |     "node": ">=16.0.0"
28 |   },
29 |   "dependencies": {
30 |     "@modelcontextprotocol/sdk": "^1.7.0",
31 |     "dotenv": "^16.4.7",
32 |     "node-fetch": "^2.7.0",
33 |     "zod": "^3.24.2"
34 |   },
35 |   "devDependencies": {
36 |     "@types/node": "^22.13.10",
37 |     "@types/node-fetch": "^2.6.12",
38 |     "ts-node": "^10.9.2",
39 |     "shx": "^0.3.4",
40 |     "typescript": "^5.8.2"
41 |   }
42 | }
43 | 
```

--------------------------------------------------------------------------------
/src/mintegral-reporting/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@feedmob/mintegral-reporting",
 3 |   "version": "0.0.4",
 4 |   "description": "MCP server for Mintegral Reporting API",
 5 |   "main": "dist/index.js",
 6 |   "author": "FeedMob",
 7 |   "homepage": "https://github.com/feed-mob/fm-mcp-servers",
 8 |   "bugs": "https://github.com/feed-mob/fm-mcp-servers/issues",
 9 |   "type": "module",
10 |   "bin": {
11 |     "mintegral-reporting": "dist/index.js"
12 |   },
13 |   "files": [
14 |     "dist",
15 |     "README.md"
16 |   ],
17 |   "keywords": [
18 |     "mcp",
19 |     "mintegral"
20 |   ],
21 |   "scripts": {
22 |     "build": "tsc && shx chmod +x dist/*.js",
23 |     "prepare": "npm run build",
24 |     "watch": "tsc --watch"
25 |   },
26 |   "engines": {
27 |     "node": ">=16.0.0"
28 |   },
29 |   "dependencies": {
30 |     "@modelcontextprotocol/sdk": "^1.11.4",
31 |     "dotenv": "^16.4.7",
32 |     "node-fetch": "^2.7.0",
33 |     "zod": "^3.24.2"
34 |   },
35 |   "devDependencies": {
36 |     "@types/node": "^22.13.10",
37 |     "@types/node-fetch": "^2.6.12",
38 |     "shx": "^0.3.4",
39 |     "ts-node": "^10.9.2",
40 |     "typescript": "^5.8.2"
41 |   }
42 | }
43 | 
```

--------------------------------------------------------------------------------
/src/user-activity-reporting/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@anthropic/user-activity-reporting",
 3 |   "version": "0.0.1",
 4 |   "description": "MCP server for querying user-client relationships and activity data",
 5 |   "type": "module",
 6 |   "main": "dist/index.js",
 7 |   "bin": {
 8 |     "user-activity-reporting": "dist/index.js"
 9 |   },
10 |   "files": [
11 |     "dist"
12 |   ],
13 |   "repository": {
14 |     "type": "git",
15 |     "url": "https://github.com/你的用户名/仓库名.git"
16 |   },
17 |   "keywords": [
18 |     "mcp",
19 |     "model-context-protocol",
20 |     "user-activity",
21 |     "reporting"
22 |   ],
23 |   "license": "MIT",
24 |   "scripts": {
25 |     "dev": "tsx src/index.ts",
26 |     "inspect": "npx fastmcp inspect dist/index.js",
27 |     "build": "tsc",
28 |     "start": "node dist/index.js"
29 |   },
30 |   "dependencies": {
31 |     "@modelcontextprotocol/sdk": "^1.0.0",
32 |     "zod": "^3.24.2",
33 |     "jsonwebtoken": "^9.0.2",
34 |     "dotenv": "^16.4.5"
35 |   },
36 |   "devDependencies": {
37 |     "@types/jsonwebtoken": "^9.0.9",
38 |     "@types/node": "^22.13.10",
39 |     "tsx": "^4.19.3",
40 |     "typescript": "^5.8.2"
41 |   }
42 | }
43 | 
```

--------------------------------------------------------------------------------
/.github/workflows/publish-github-issues.yml:
--------------------------------------------------------------------------------

```yaml
 1 | name: Publish GitHub Issues Package
 2 | 
 3 | on:
 4 |   push:
 5 |     branches:
 6 |       - main
 7 |     paths:
 8 |       - 'src/github-issues/**'
 9 |   workflow_dispatch:
10 |     inputs:
11 |       publish:
12 |         description: 'Confirm publishing GitHub Issues package'
13 |         required: true
14 |         type: boolean
15 |         default: false
16 | 
17 | jobs:
18 |   publish:
19 |     runs-on: ubuntu-latest
20 |     if: ${{ github.event_name == 'push' || github.event.inputs.publish == 'true' }}
21 |     defaults:
22 |       run:
23 |         working-directory: src/github-issues
24 | 
25 |     steps:
26 |       - uses: actions/checkout@v4
27 | 
28 |       - name: Setup Node.js
29 |         uses: actions/setup-node@v4
30 |         with:
31 |           node-version: '20'
32 |           registry-url: 'https://registry.npmjs.org'
33 | 
34 |       - name: Install dependencies
35 |         run: npm ci
36 | 
37 |       - name: Build
38 |         run: npm run build
39 | 
40 |       - name: Publish to npm
41 |         run: npm publish --access public
42 |         env:
43 |           NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTOMATION_TOKEN }}
44 | 
```

--------------------------------------------------------------------------------
/.github/workflows/publish-work-journals.yml:
--------------------------------------------------------------------------------

```yaml
 1 | name: Publish Work Journals Package
 2 | 
 3 | on:
 4 |   push:
 5 |     branches:
 6 |       - main
 7 |     paths:
 8 |       - 'src/work-journals/**'
 9 |   workflow_dispatch:
10 |     inputs:
11 |       publish:
12 |         description: 'Confirm publishing Work Journals package'
13 |         required: true
14 |         type: boolean
15 |         default: false
16 | 
17 | jobs:
18 |   publish:
19 |     runs-on: ubuntu-latest
20 |     if: ${{ github.event_name == 'push' || github.event.inputs.publish == 'true' }}
21 |     defaults:
22 |       run:
23 |         working-directory: src/work-journals
24 | 
25 |     steps:
26 |       - uses: actions/checkout@v4
27 | 
28 |       - name: Setup Node.js
29 |         uses: actions/setup-node@v4
30 |         with:
31 |           node-version: '20'
32 |           registry-url: 'https://registry.npmjs.org'
33 | 
34 |       - name: Install dependencies
35 |         run: npm ci
36 | 
37 |       - name: Build
38 |         run: npm run build
39 | 
40 |       - name: Publish to npm
41 |         run: npm publish --access public
42 |         env:
43 |           NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTOMATION_TOKEN }}
44 | 
```

--------------------------------------------------------------------------------
/src/jampp-reporting/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@feedmob/jampp-reporting",
 3 |   "version": "0.1.3",
 4 |   "description": "MCP server for Jampp API",
 5 |   "main": "dist/index.js",
 6 |   "author": "FeedMob",
 7 |   "homepage": "https://github.com/feed-mob/fm-mcp-servers",
 8 |   "bugs": "https://github.com/feed-mob/fm-mcp-servers/issues",
 9 |   "type": "module",
10 |   "bin": {
11 |     "jampp-reporting": "dist/index.js"
12 |   },
13 |   "files": [
14 |     "dist",
15 |     "README.md"
16 |   ],
17 |   "keywords": [
18 |     "mcp",
19 |     "jampp",
20 |     "reporting",
21 |     "feedmob"
22 |   ],
23 |   "scripts": {
24 |     "build": "tsc && shx chmod +x dist/*.js",
25 |     "prepare": "npm run build",
26 |     "watch": "tsc --watch"
27 |   },
28 |   "engines": {
29 |     "node": ">=16.0.0"
30 |   },
31 |   "dependencies": {
32 |     "@modelcontextprotocol/sdk": "^1.6.1",
33 |     "dotenv": "^16.4.7",
34 |     "node-fetch": "^2.7.0",
35 |     "zod": "^3.24.2"
36 |   },
37 |   "devDependencies": {
38 |     "@types/node": "^22.13.10",
39 |     "@types/node-fetch": "^2.6.12",
40 |     "ts-node": "^10.9.2",
41 |     "shx": "^0.3.4",
42 |     "typescript": "^5.8.2"
43 |   }
44 | }
45 | 
```

--------------------------------------------------------------------------------
/.github/workflows/publish-civitai-records.yml:
--------------------------------------------------------------------------------

```yaml
 1 | name: Publish Civitai Records Package
 2 | 
 3 | on:
 4 |   push:
 5 |     branches:
 6 |       - main
 7 |     paths:
 8 |       - 'src/civitai-records/**'
 9 |   workflow_dispatch:
10 |     inputs:
11 |       publish:
12 |         description: 'Confirm publishing Civitai Records package'
13 |         required: true
14 |         type: boolean
15 |         default: false
16 | 
17 | jobs:
18 |   publish:
19 |     runs-on: ubuntu-latest
20 |     if: ${{ github.event_name == 'push' || github.event.inputs.publish == 'true' }}
21 |     defaults:
22 |       run:
23 |         working-directory: src/civitai-records
24 | 
25 |     steps:
26 |       - uses: actions/checkout@v4
27 | 
28 |       - name: Setup Node.js
29 |         uses: actions/setup-node@v4
30 |         with:
31 |           node-version: '20'
32 |           registry-url: 'https://registry.npmjs.org'
33 | 
34 |       - name: Install dependencies
35 |         run: npm ci
36 | 
37 |       - name: Build
38 |         run: npm run build
39 | 
40 |       - name: Publish to npm
41 |         run: npm publish --access public
42 |         env:
43 |           NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTOMATION_TOKEN }}
44 | 
```

--------------------------------------------------------------------------------
/src/ironsource-aura-reporting/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@feedmob/ironsource-aura-reporting",
 3 |   "version": "0.0.1",
 4 |   "description": "MCP server for IronSource Aura API",
 5 |   "main": "dist/index.js",
 6 |   "author": "FeedMob",
 7 |   "homepage": "https://github.com/feed-mob/fm-mcp-servers",
 8 |   "bugs": "https://github.com/feed-mob/fm-mcp-servers/issues",
 9 |   "type": "module",
10 |   "bin": {
11 |     "ironsource-aura-reporting": "dist/index.js"
12 |   },
13 |   "files": [
14 |     "dist",
15 |     "README.md"
16 |   ],
17 |   "keywords": [
18 |     "mcp",
19 |     "ironsourceAura"
20 |   ],
21 |   "scripts": {
22 |     "build": "tsc && shx chmod +x dist/*.js",
23 |     "prepare": "npm run build",
24 |     "watch": "tsc --watch"
25 |   },
26 |   "engines": {
27 |     "node": ">=16.0.0"
28 |   },
29 |   "dependencies": {
30 |     "@modelcontextprotocol/sdk": "^1.7.0",
31 |     "dotenv": "^16.4.7",
32 |     "node-fetch": "^2.7.0",
33 |     "zod": "^3.24.2"
34 |   },
35 |   "devDependencies": {
36 |     "@types/node": "^22.13.10",
37 |     "@types/node-fetch": "^2.6.12",
38 |     "ts-node": "^10.9.2",
39 |     "shx": "^0.3.4",
40 |     "typescript": "^5.8.2"
41 |   }
42 | }
43 | 
```

--------------------------------------------------------------------------------
/src/femini-reporting/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@feedmob/femini-reporting",
 3 |   "version": "0.0.5",
 4 |   "description": "This is a customized MCP server for the Feedmob project, specifically for querying and analyzing ad spend data.",
 5 |   "main": "src/index.ts",
 6 |   "homepage": "https://github.com/feed-mob/fm-mcp-servers",
 7 |   "bugs": "https://github.com/feed-mob/fm-mcp-servers/issues",
 8 |   "type": "module",
 9 |   "bin": {
10 |     "femini-reporting": "dist/index.js"
11 |   },
12 |   "scripts": {
13 |     "build": "tsc && shx chmod +x dist/*.js",
14 |     "prepare": "npm run build",
15 |     "watch": "tsc --watch"
16 |   },
17 |   "keywords": [
18 |     "mcp",
19 |     "femini"
20 |   ],
21 |   "files": [
22 |     "dist",
23 |     "README.md"
24 |   ],
25 |   "author": "FeedMob",
26 |   "license": "ISC",
27 |   "dependencies": {
28 |     "dotenv": "^16.4.5",
29 |     "fastmcp": "^3.6.2",
30 |     "jsonwebtoken": "^9.0.2",
31 |     "zod": "^3.23.8"
32 |   },
33 |   "devDependencies": {
34 |     "@types/jsonwebtoken": "^9.0.10",
35 |     "@types/node": "^24.0.10",
36 |     "shx": "^0.3.4",
37 |     "typescript": "^5.5.3"
38 |   },
39 |   "engines": {
40 |     "node": ">=16.0.0"
41 |   }
42 | }
43 | 
```

--------------------------------------------------------------------------------
/src/samsung-reporting/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@feedmob/samsung-reporting",
 3 |   "version": "0.1.2",
 4 |   "description": "MCP server for Samsung API",
 5 |   "main": "dist/index.js",
 6 |   "author": "FeedMob",
 7 |   "homepage": "https://github.com/feed-mob/fm-mcp-servers",
 8 |   "bugs": "https://github.com/feed-mob/fm-mcp-servers/issues",
 9 |   "type": "module",
10 |   "bin": {
11 |     "samsung-reporting": "dist/index.js"
12 |   },
13 |   "files": [
14 |     "dist",
15 |     "README.md"
16 |   ],
17 |   "keywords": [
18 |     "mcp",
19 |     "samsung"
20 |   ],
21 |   "scripts": {
22 |     "build": "tsc && shx chmod +x dist/*.js",
23 |     "prepare": "npm run build",
24 |     "watch": "tsc --watch"
25 |   },
26 |   "engines": {
27 |     "node": ">=16.0.0"
28 |   },
29 |   "dependencies": {
30 |     "@modelcontextprotocol/sdk": "^1.7.0",
31 |     "dotenv": "^16.4.7",
32 |     "jsonwebtoken": "^9.0.2",
33 |     "node-fetch": "^2.7.0",
34 |     "zod": "^3.24.2"
35 |   },
36 |   "devDependencies": {
37 |     "@types/jsonwebtoken": "^9.0.7",
38 |     "@types/node": "^22.15.21",
39 |     "@types/node-fetch": "^2.6.12",
40 |     "shx": "^0.3.4",
41 |     "ts-node": "^10.9.2",
42 |     "typescript": "^5.8.2"
43 |   }
44 | }
45 | 
```

--------------------------------------------------------------------------------
/src/singular-reporting/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@feedmob/singular-reporting",
 3 |   "version": "0.0.3",
 4 |   "description": "MCP server for Singular Reporting",
 5 |   "main": "dist/index.js",
 6 |   "author": "FeedMob",
 7 |   "homepage": "https://github.com/feed-mob/fm-mcp-servers",
 8 |   "bugs": "https://github.com/feed-mob/fm-mcp-servers/issues",
 9 |   "type": "module",
10 |   "bin": {
11 |     "singular-reporting": "dist/index.js"
12 |   },
13 |   "files": [
14 |     "dist",
15 |     "README.md"
16 |   ],
17 |   "keywords": [
18 |     "mcp",
19 |     "singular",
20 |     "reporting",
21 |     "feedmob"
22 |   ],
23 |   "scripts": {
24 |     "build": "tsc && shx chmod +x dist/*.js",
25 |     "prepare": "npm run build",
26 |     "watch": "tsc --watch"
27 |   },
28 |   "engines": {
29 |     "node": ">=16.0.0"
30 |   },
31 |   "dependencies": {
32 |     "@modelcontextprotocol/sdk": "^1.7.0",
33 |     "@types/node": "^20.11.24",
34 |     "axios": "^1.6.7",
35 |     "dotenv": "^16.4.5",
36 |     "zod": "^3.22.4"
37 |   },
38 |   "devDependencies": {
39 |     "@types/node": "^22.13.10",
40 |     "@types/node-fetch": "^2.6.12",
41 |     "ts-node": "^10.9.2",
42 |     "shx": "^0.3.4",
43 |     "typescript": "^5.8.2"
44 |   }
45 | }
46 | 
```

--------------------------------------------------------------------------------
/src/rtb-house-reporting/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@feedmob/rtb-house-reporting",
 3 |   "version": "0.0.2",
 4 |   "description": "MCP server for RTB House API",
 5 |   "main": "dist/index.js",
 6 |   "author": "FeedMob",
 7 |   "homepage": "https://github.com/feed-mob/fm-mcp-servers",
 8 |   "bugs": "https://github.com/feed-mob/fm-mcp-servers/issues",
 9 |   "type": "module",
10 |   "bin": {
11 |     "rtb-house-reporting": "dist/index.js"
12 |   },
13 |   "files": [
14 |     "dist",
15 |     "README.md"
16 |   ],
17 |   "keywords": [
18 |     "mcp",
19 |     "rtb-house"
20 |   ],
21 |   "scripts": {
22 |     "build": "tsc && shx chmod +x dist/*.js",
23 |     "prepare": "npm run build",
24 |     "watch": "tsc --watch"
25 |   },
26 |   "engines": {
27 |     "node": ">=16.0.0"
28 |   },
29 |   "dependencies": {
30 |     "@modelcontextprotocol/sdk": "^1.7.0",
31 |     "dotenv": "^16.4.7",
32 |     "jsonwebtoken": "^9.0.2",
33 |     "node-fetch": "^2.7.0",
34 |     "zod": "^3.24.2"
35 |   },
36 |   "devDependencies": {
37 |     "@types/jsonwebtoken": "^9.0.7",
38 |     "@types/node": "^22.15.21",
39 |     "@types/node-fetch": "^2.6.12",
40 |     "shx": "^0.3.4",
41 |     "ts-node": "^10.9.2",
42 |     "typescript": "^5.8.2"
43 |   }
44 | }
45 | 
```

--------------------------------------------------------------------------------
/src/sensor-tower-reporting/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@feedmob/sensor-tower-reporting",
 3 |   "version": "0.1.2",
 4 |   "description": "MCP server for sensor-tower API",
 5 |   "main": "dist/index.js",
 6 |   "author": "FeedMob",
 7 |   "homepage": "https://github.com/feed-mob/fm-mcp-servers",
 8 |   "bugs": "https://github.com/feed-mob/fm-mcp-servers/issues",
 9 |   "type": "module",
10 |   "bin": {
11 |     "sensor-tower-reporting": "dist/index.js"
12 |   },
13 |   "files": [
14 |     "dist",
15 |     "README.md"
16 |   ],
17 |   "keywords": [
18 |     "mcp",
19 |     "sensor-tower-reporting"
20 |   ],
21 |   "scripts": {
22 |     "build": "tsc && shx chmod +x dist/*.js",
23 |     "prepare": "npm run build",
24 |     "watch": "tsc --watch"
25 |   },
26 |   "engines": {
27 |     "node": ">=16.0.0"
28 |   },
29 |   "dependencies": {
30 |     "@modelcontextprotocol/sdk": "^1.7.0",
31 |     "dotenv": "^16.4.7",
32 |     "jsonwebtoken": "^9.0.2",
33 |     "node-fetch": "^2.7.0",
34 |     "zod": "^3.24.2"
35 |   },
36 |   "devDependencies": {
37 |     "@types/jsonwebtoken": "^9.0.7",
38 |     "@types/node": "^22.15.21",
39 |     "@types/node-fetch": "^2.6.12",
40 |     "shx": "^0.3.4",
41 |     "ts-node": "^10.9.2",
42 |     "typescript": "^5.8.2"
43 |   }
44 | }
45 | 
```

--------------------------------------------------------------------------------
/.github/workflows/publish-n8n-nodes-feedmob-direct-spend-visualizer.yml:
--------------------------------------------------------------------------------

```yaml
 1 | name: Publish n8n Direct Spend Visualizer Package
 2 | 
 3 | on:
 4 |   push:
 5 |     branches:
 6 |       - main
 7 |     paths:
 8 |       - 'src/n8n-nodes-feedmob-direct-spend-visualizer/**'
 9 |   workflow_dispatch:
10 |     inputs:
11 |       publish:
12 |         description: 'Confirm publishing n8n Direct Spend Visualizer package'
13 |         required: true
14 |         type: boolean
15 |         default: false
16 | 
17 | jobs:
18 |   publish:
19 |     runs-on: ubuntu-latest
20 |     if: ${{ github.event_name == 'push' || github.event.inputs.publish == 'true' }}
21 |     defaults:
22 |       run:
23 |         working-directory: src/n8n-nodes-feedmob-direct-spend-visualizer
24 | 
25 |     steps:
26 |       - uses: actions/checkout@v4
27 | 
28 |       - name: Setup Node.js
29 |         uses: actions/setup-node@v4
30 |         with:
31 |           node-version: '20'
32 |           registry-url: 'https://registry.npmjs.org'
33 | 
34 |       - name: Install dependencies
35 |         run: npm ci
36 | 
37 |       - name: Build
38 |         run: npm run build
39 | 
40 |       - name: Publish to npm
41 |         run: npm publish --access public
42 |         env:
43 |           NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTOMATION_TOKEN }}
44 | 
```

--------------------------------------------------------------------------------
/src/civitai-records/src/tools/getWorkflowGuide.ts:
--------------------------------------------------------------------------------

```typescript
 1 | import type { ContentResult } from "fastmcp";
 2 | import * as fs from "fs";
 3 | import * as path from "path";
 4 | import { fileURLToPath } from "url";
 5 | import { z } from "zod";
 6 | 
 7 | const __filename = fileURLToPath(import.meta.url);
 8 | const __dirname = path.dirname(__filename);
 9 | 
10 | export const getWorkflowGuideParameters = z.object({});
11 | 
12 | export type GetWorkflowGuideParameters = z.infer<typeof getWorkflowGuideParameters>;
13 | 
14 | export const getWorkflowGuideTool = {
15 |   name: "get_workflow_guide",
16 |   description: "Get the complete step-by-step guide for properly recording Civitai posts, prompts, and assets. Use this to understand the correct workflow order and best practices.",
17 |   parameters: getWorkflowGuideParameters,
18 |   execute: async (): Promise<ContentResult> => {
19 |     const workflowContent = await fs.promises.readFile(
20 |       path.join(__dirname, "../prompts/record-civitai-workflow.md"),
21 |       "utf-8"
22 |     );
23 |     return {
24 |       content: [
25 |         {
26 |           type: "text",
27 |           text: workflowContent,
28 |         },
29 |       ],
30 |     } satisfies ContentResult;
31 |   },
32 | };
33 | 
```

--------------------------------------------------------------------------------
/src/civitai-records/infra/db-init/09_migration_update_functions_for_on_behalf_of.sql:
--------------------------------------------------------------------------------

```sql
 1 | -- =========================================================
 2 | -- 09_update_functions_for_on_behalf_of.sql
 3 | -- Update trigger functions to support on_behalf_of column
 4 | -- =========================================================
 5 | 
 6 | SET ROLE civitai_owner;
 7 | 
 8 | -- Update BEFORE trigger: maintain created_by/updated_by/on_behalf_of + timestamps
 9 | CREATE OR REPLACE FUNCTION civitai.set_created_updated_by()
10 | RETURNS trigger AS $$
11 | BEGIN
12 |   IF (TG_OP = 'INSERT') THEN
13 |     NEW.created_by := current_user;           -- actual login role
14 |     NEW.updated_by := current_user;
15 |     
16 |     -- Auto-populate on_behalf_of from created_by if not explicitly set
17 |     IF NEW.on_behalf_of IS NULL THEN
18 |       NEW.on_behalf_of := NEW.created_by;
19 |     END IF;
20 |     
21 |     NEW.created_at := COALESCE(NEW.created_at, now());
22 |     NEW.updated_at := now();
23 |   ELSIF (TG_OP = 'UPDATE') THEN
24 |     IF NEW.created_by IS DISTINCT FROM OLD.created_by THEN
25 |       RAISE EXCEPTION 'created_by is immutable';
26 |     END IF;
27 |     NEW.updated_by := current_user;
28 |     NEW.updated_at := now();
29 |   END IF;
30 |   RETURN NEW;
31 | END;
32 | $$ LANGUAGE plpgsql;
33 | 
34 | RESET ROLE;
35 | 
```

--------------------------------------------------------------------------------
/src/civitai-records/infra/db-init/04_create_prompts.sql:
--------------------------------------------------------------------------------

```sql
 1 | -- =========================================================
 2 | -- 04_create_prompts.sql
 3 | -- Define civitai.prompts and register it for grants/triggers/RLS
 4 | -- =========================================================
 5 | 
 6 | SET ROLE civitai_owner;
 7 | 
 8 | CREATE TABLE civitai.prompts (
 9 |   id                  bigserial PRIMARY KEY,
10 |   content             text NOT NULL,
11 |   llm_model_provider  text NULL,
12 |   llm_model           text NULL,
13 |   purpose             text NULL,
14 |   metadata            jsonb,
15 |   created_by          text NOT NULL DEFAULT current_user,
16 |   updated_by          text NOT NULL DEFAULT current_user,
17 |   created_at          timestamptz NOT NULL DEFAULT now(),
18 |   updated_at          timestamptz NOT NULL DEFAULT now()
19 | );
20 | 
21 | -- Permissive mode: any user can update any record
22 | SELECT civitai.register_audited_table(
23 |   p_table              := 'civitai.prompts'::regclass,
24 |   p_grant_role         := 'civitai_user',
25 |   p_id_col             := 'id',
26 |   p_rls_mode           := 'permissive',  -- switch to 'owned' for creator-only updates
27 |   p_block_delete       := true,
28 |   p_protect_audit_cols := true
29 | );
30 | 
31 | RESET ROLE;
32 | 
```

--------------------------------------------------------------------------------
/src/n8n-nodes-sensor-tower/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@feedmob/n8n-nodes-sensor-tower",
 3 |   "version": "0.1.0",
 4 |   "description": "n8n nodes for Sensor Tower Reporting (wraps MCP tools)",
 5 |   "keywords": [
 6 |     "n8n-community-node-package",
 7 |     "n8n",
 8 |     "sensor-tower",
 9 |     "mcp"
10 |   ],
11 |   "author": "FeedMob",
12 |   "license": "MIT",
13 |   "homepage": "https://github.com/feed-mob/fm-mcp-servers",
14 |   "bugs": "https://github.com/feed-mob/fm-mcp-servers/issues",
15 |   "main": "dist/index.js",
16 |   "scripts": {
17 |     "build": "tsc && node -e \"fs=require('fs');fs.mkdirSync('dist/nodes/SensorTower',{recursive:true});fs.copyFileSync('nodes/SensorTower/logo.svg','dist/nodes/SensorTower/logo.svg')\"",
18 |     "dev": "tsc --watch",
19 |     "prepare": "npm run build"
20 |   },
21 |   "n8n": {
22 |     "nodes": [
23 |       "./dist/nodes/SensorTower/SensorTower.node.js"
24 |     ],
25 |     "credentials": [
26 |       "./dist/credentials/SensorTowerApi.credentials.js"
27 |     ]
28 |   },
29 |   "publishConfig": {
30 |     "access": "public"
31 |   },
32 |   "dependencies": {},
33 |   "devDependencies": {
34 |     "n8n-core": "^1.68.0",
35 |     "n8n-workflow": "^1.68.0",
36 |     "typescript": "^5.8.2"
37 |   },
38 |   "engines": {
39 |     "node": ">=18.17.0"
40 |   },
41 |   "files": [
42 |     "dist"
43 |   ]
44 | }
45 | 
46 | 
47 | 
```

--------------------------------------------------------------------------------
/src/impact-radius-reporting/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "@feedmob/impact-radius-reporting",
 3 |   "version": "0.0.1",
 4 |   "description": "MCP server for Impact Radius Reporting",
 5 |   "main": "dist/index.js",
 6 |   "author": "FeedMob",
 7 |   "homepage": "https://github.com/feed-mob/fm-mcp-servers",
 8 |   "bugs": "https://github.com/feed-mob/fm-mcp-servers/issues",
 9 |   "type": "module",
10 |   "bin": {
11 |     "impact-radius-reporting": "dist/index.js"
12 |   },
13 |   "files": [
14 |     "dist",
15 |     "README.md"
16 |   ],
17 |   "keywords": [
18 |     "mcp",
19 |     "impact-radius",
20 |     "reporting",
21 |     "feedmob"
22 |   ],
23 |   "scripts": {
24 |     "build": "tsc && shx chmod +x dist/*.js",
25 |     "prepare": "npm run build",
26 |     "watch": "tsc --watch",
27 |     "test": "node test_fetch_action_list.js"
28 |   },
29 |   "engines": {
30 |     "node": ">=16.0.0"
31 |   },
32 |   "dependencies": {
33 |     "@modelcontextprotocol/sdk": "^1.7.0",
34 |     "@types/node": "^20.11.24",
35 |     "axios": "^1.6.7",
36 |     "dotenv": "^16.4.5",
37 |     "jsonwebtoken": "^9.0.2",
38 |     "zod": "^3.22.4"
39 |   },
40 |   "devDependencies": {
41 |     "@types/jsonwebtoken": "^9.0.0",
42 |     "@types/node": "^22.13.10",
43 |     "@types/node-fetch": "^2.6.12",
44 |     "shx": "^0.3.4",
45 |     "ts-node": "^10.9.2",
46 |     "typescript": "^5.8.2"
47 |   }
48 | }
49 | 
```

--------------------------------------------------------------------------------
/src/n8n-nodes-feedmob-direct-spend-visualizer/scripts/setup-plugin.js:
--------------------------------------------------------------------------------

```javascript
 1 | #!/usr/bin/env node
 2 | 
 3 | const { spawnSync } = require('child_process');
 4 | const { existsSync, mkdirSync } = require('fs');
 5 | const { join } = require('path');
 6 | 
 7 | const REPO_URL = 'https://github.com/feed-mob/claude-code-marketplace.git';
 8 | const VENDOR_DIR = join(__dirname, '..', 'vendor');
 9 | const TARGET_DIR = join(VENDOR_DIR, 'claude-code-marketplace');
10 | 
11 | function run(command, args, options = {}) {
12 |   const result = spawnSync(command, args, { stdio: 'inherit', ...options });
13 |   if (result.status !== 0) {
14 |     throw new Error(`Command ${command} ${args.join(' ')} failed with code ${result.status ?? 'unknown'}`);
15 |   }
16 | }
17 | 
18 | function ensureRepo() {
19 |   if (!existsSync(VENDOR_DIR)) {
20 |     mkdirSync(VENDOR_DIR, { recursive: true });
21 |   }
22 |   if (!existsSync(TARGET_DIR)) {
23 |     run('git', ['clone', '--depth', '1', REPO_URL, TARGET_DIR]);
24 |     return;
25 |   }
26 |   run('git', ['-C', TARGET_DIR, 'fetch', '--all', '--prune']);
27 |   run('git', ['-C', TARGET_DIR, 'reset', '--hard', 'origin/main']);
28 | }
29 | 
30 | try {
31 |   ensureRepo();
32 |   console.log(`[setup-plugin] Ready: ${TARGET_DIR}`);
33 | } catch (error) {
34 |   console.error('[setup-plugin] Failed to prepare plugin repository:', error.message);
35 |   process.exit(1);
36 | }
37 | 
```

--------------------------------------------------------------------------------
/src/civitai-records/infra/db-init/12_fix_trigger_for_tables_without_on_behalf_of.sql:
--------------------------------------------------------------------------------

```sql
 1 | -- =========================================================
 2 | -- 12_fix_trigger_for_tables_without_on_behalf_of.sql
 3 | -- Update trigger function to conditionally handle on_behalf_of
 4 | -- =========================================================
 5 | 
 6 | SET ROLE civitai_owner;
 7 | 
 8 | CREATE OR REPLACE FUNCTION civitai.set_created_updated_by()
 9 | RETURNS trigger AS $$
10 | BEGIN
11 |   IF (TG_OP = 'INSERT') THEN
12 |     NEW.created_by := current_user;
13 |     NEW.updated_by := current_user;
14 |     
15 |     -- Auto-populate on_behalf_of from created_by if not explicitly set
16 |     -- Silently skip if the column doesn't exist
17 |     BEGIN
18 |       IF NEW.on_behalf_of IS NULL THEN
19 |         NEW.on_behalf_of := NEW.created_by;
20 |       END IF;
21 |     EXCEPTION
22 |       WHEN undefined_column THEN
23 |         -- Table doesn't have on_behalf_of column, skip
24 |         NULL;
25 |     END;
26 |     
27 |     NEW.created_at := COALESCE(NEW.created_at, now());
28 |     NEW.updated_at := now();
29 |   ELSIF (TG_OP = 'UPDATE') THEN
30 |     IF NEW.created_by IS DISTINCT FROM OLD.created_by THEN
31 |       RAISE EXCEPTION 'created_by is immutable';
32 |     END IF;
33 |     NEW.updated_by := current_user;
34 |     NEW.updated_at := now();
35 |   END IF;
36 |   RETURN NEW;
37 | END;
38 | $$ LANGUAGE plpgsql;
39 | 
40 | RESET ROLE;
41 | 
```

--------------------------------------------------------------------------------
/src/civitai-records/infra/db-init/06_create_civitai_posts.sql:
--------------------------------------------------------------------------------

```sql
 1 | -- =========================================================
 2 | -- 06_create_civitai_posts.sql
 3 | -- Define civitai.civitai_posts and register it for grants/triggers/RLS
 4 | -- =========================================================
 5 | 
 6 | SET ROLE civitai_owner;
 7 | 
 8 | CREATE TYPE civitai.post_status AS ENUM ('pending', 'published', 'failed');
 9 | 
10 | CREATE TABLE civitai.civitai_posts (
11 |   id              bigserial PRIMARY KEY,
12 |   title           text NULL,
13 |   description     text NULL,
14 |   civitai_id      text NOT NULL,
15 |   civitai_url     text NOT NULL,
16 |   civitai_account text NOT NULL DEFAULT 'c29',
17 |   status          civitai.post_status NOT NULL,
18 |   metadata        jsonb,
19 |   created_by      text NOT NULL DEFAULT current_user,
20 |   updated_by      text NOT NULL DEFAULT current_user,
21 |   created_at      timestamptz NOT NULL DEFAULT now(),
22 |   updated_at      timestamptz NOT NULL DEFAULT now()
23 | );
24 | 
25 | -- Permissive mode: any user can update any record
26 | SELECT civitai.register_audited_table(
27 |   p_table              := 'civitai.civitai_posts'::regclass,
28 |   p_grant_role         := 'civitai_user',
29 |   p_id_col             := 'id',
30 |   p_rls_mode           := 'permissive',
31 |   p_block_delete       := true,
32 |   p_protect_audit_cols := true
33 | );
34 | 
35 | RESET ROLE;
36 | 
```

--------------------------------------------------------------------------------
/src/civitai-records/infra/db-init/11_create_asset_stats.sql:
--------------------------------------------------------------------------------

```sql
 1 | -- =========================================================
 2 | -- 11_create_asset_stats.sql
 3 | -- Define civitai.asset_stats and register it for grants/triggers/RLS
 4 | -- =========================================================
 5 | 
 6 | SET ROLE civitai_owner;
 7 | 
 8 | CREATE TABLE civitai.asset_stats (
 9 |   id               bigserial PRIMARY KEY,
10 |   asset_id         bigint NOT NULL REFERENCES civitai.assets(id),
11 |   cry_count        bigint NOT NULL DEFAULT 0,
12 |   laugh_count      bigint NOT NULL DEFAULT 0,
13 |   like_count       bigint NOT NULL DEFAULT 0,
14 |   dislike_count    bigint NOT NULL DEFAULT 0,
15 |   heart_count      bigint NOT NULL DEFAULT 0,
16 |   comment_count    bigint NOT NULL DEFAULT 0,
17 |   created_by       text NOT NULL DEFAULT current_user,
18 |   updated_by       text NOT NULL DEFAULT current_user,
19 |   created_at       timestamptz NOT NULL DEFAULT now(),
20 |   updated_at       timestamptz NOT NULL DEFAULT now(),
21 |   UNIQUE(asset_id)
22 | );
23 | 
24 | -- Permissive mode: any user can update any record
25 | SELECT civitai.register_audited_table(
26 |   p_table              := 'civitai.asset_stats'::regclass,
27 |   p_grant_role         := 'civitai_user',
28 |   p_id_col             := 'id',
29 |   p_rls_mode           := 'permissive',
30 |   p_block_delete       := true,
31 |   p_protect_audit_cols := true
32 | );
33 | 
34 | RESET ROLE;
35 | 
```

--------------------------------------------------------------------------------
/src/n8n-nodes-feedmob-direct-spend-visualizer/scripts/build-assets.js:
--------------------------------------------------------------------------------

```javascript
 1 | #!/usr/bin/env node
 2 | 
 3 | const { cpSync, existsSync, mkdirSync } = require('fs');
 4 | const { dirname, join } = require('path');
 5 | 
 6 | const ROOT_DIR = join(__dirname, '..');
 7 | const DIST_DIR = join(ROOT_DIR, 'dist');
 8 | const LOGO_SRC = join(ROOT_DIR, 'nodes', 'FeedmobDirectSpendVisualizer', 'logo.svg');
 9 | const LOGO_DEST = join(DIST_DIR, 'nodes', 'FeedmobDirectSpendVisualizer', 'logo.svg');
10 | const VENDOR_SRC = join(ROOT_DIR, 'vendor', 'claude-code-marketplace');
11 | const VENDOR_PLUGIN_SRC = join(VENDOR_SRC, 'plugins', 'direct-spend-visualizer');
12 | const VENDOR_PLUGIN_DEST = join(DIST_DIR, 'vendor', 'claude-code-marketplace', 'plugins', 'direct-spend-visualizer');
13 | 
14 | function ensureDir(path) {
15 |   if (!existsSync(path)) {
16 |     mkdirSync(path, { recursive: true });
17 |   }
18 | }
19 | 
20 | function copyLogo() {
21 |   ensureDir(dirname(LOGO_DEST));
22 |   cpSync(LOGO_SRC, LOGO_DEST);
23 | }
24 | 
25 | function copyPlugin() {
26 |   if (!existsSync(VENDOR_PLUGIN_SRC)) {
27 |     throw new Error(`Plugin source directory not found at ${VENDOR_PLUGIN_SRC}. Run npm install to clone the marketplace repo.`);
28 |   }
29 |   ensureDir(dirname(VENDOR_PLUGIN_DEST));
30 |   cpSync(VENDOR_PLUGIN_SRC, VENDOR_PLUGIN_DEST, { recursive: true });
31 | }
32 | 
33 | function main() {
34 |   copyLogo();
35 |   copyPlugin();
36 |   console.log('[build-assets] Copied assets to dist');
37 | }
38 | 
39 | main();
40 | 
```
Page 1/5FirstPrevNextLast